带你走进 JVM Memory Model

带你走进 JVM Memory Model


  • JVM内存结构主要由:堆内存(Heap),方法区(Method Area),栈(Stack)三部分组成
    带你走进 JVM Memory Model
    从上图我们可以知道:

    1.堆内存占据了JVM的大部分内存,同时它又可以细分为年轻代(Young Generation)和老年代(Old Generation)两块,其中新生代又可进一步细分为伊甸区(Eden Space),幸存者区域(Survivor Space),默认情况下年轻代按照 8:1:1比例分配。

    2.方法区存储类信息,常量,静态变量等数据,与堆内存同属线程共享区,为与Java堆区分,方法区还有一个别名Non-Heap(非堆)。

    3.栈区分为虚拟机栈(java stack)和本地栈(native method stack)用于方法的执行,为线程私有

    补充:Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。


  • 下面我们通过一张图来了解如何使用参数控制各区域内存大小
    带你走进 JVM Memory Model
    控制参数:

    • -Xmx设置最大堆空间
    • -Xms设置最小堆空间
    • -XX:MaxNewSize设置最大新生代空间
    • -XX:NewSize设置最小新生代空间
    • -XX:MaxPermSize设置最大永久代空间
    • -XX:PermSize设置最小永久代空间
    • -Xss设置每个线程的堆栈大小

    没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。
    老年代空间大小=堆空间大小-年轻代大空间大小


  • 现在从更高的一个维度再次来看JVM和系统调用之间的关系
    带你走进 JVM Memory Model
    方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。

  • Conclusion
Area available contain
Heap shared among all threads(global) stores all created objects and arrays
Method Area shared among all threads(global) stores class structures like field,method data,code for methods and constructors,etc
Stack private stack(local) hold reference to objects in heap and store variables and primitive types