带你走进 JVM Memory Model
- JVM内存结构主要由:堆内存(Heap),方法区(Method Area),栈(Stack)三部分组成
从上图我们可以知道:
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空间等。
下面我们通过一张图来了解如何使用参数控制各区域内存大小
控制参数:- -Xmx设置最大堆空间
- -Xms设置最小堆空间
- -XX:MaxNewSize设置最大新生代空间
- -XX:NewSize设置最小新生代空间
- -XX:MaxPermSize设置最大永久代空间
- -XX:PermSize设置最小永久代空间
- -Xss设置每个线程的堆栈大小
没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。
老年代空间大小=堆空间大小-年轻代大空间大小
- 现在从更高的一个维度再次来看JVM和系统调用之间的关系
方法区和堆是所有线程共享的内存区域;而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 |