JVM虚拟机数据区:
堆
本地方法栈、虚拟机栈、程序计数器
本地内存:
元数据区、直接内存
2.1 青年代划分
青年代分为伊甸(Eden)、Survivor0(S0)、Survivor1(S1)区,其中默认情况下伊甸和S0、S1内存占比是8:1:1(原因是HotSpot虚拟机设计团队认为超过80%的对象在一次GC中就会被回收,实际上IBM公司做过研究98%的对象只会被使用一次。PS:在一些博客上看到写的是年轻代中三个区的比是6:1:1但是我在“深入理解JAVA虚拟机第二版”第70页中看到的是8:1:1,所以此处我认为8:1:1是正确的)
2.2 青年代对象特点
青年代对象特点是"朝生夕死"即短时间内会产生大量死亡对象,默认大小为堆大小的1/15。
-Xmn:16m 参数可以设置年轻代的固定大小(示例为设置年轻代大小为16m)
-XX:NewRatio=4 可以设置年轻代与老年代的大小比例(示例为设置年轻代与老年代大小比例是1:4)-Xmx:xxx 和 -Xms:xxx 可以设置堆总的大小,老年代只能通过-Xmn或-XX:NewRatio参数间接设置
2.3 青年代垃圾回收
基于青年代的对象产生-消亡特点,所以在青年代中的垃圾回收采用的是复制-清除算法,对青年代的垃圾回收称为初级回收(即:Minor GC)
Minor GC过程如下:
步骤1. 程序挂起
步骤2. 将Eden区和活动Survivor区中存活的对象复制到另一个Survivor区中,复制的同时将对象的存活次数计数器加1如果对象次数达到设定次数会被移入老年代,对象过大也会被移入老年代
步骤3. 清除原来的Eden区和原来的活动Survivor区
步骤4. 将原来的Survivor区标记为非活动区,将对象移入的Survivor区标记为活动区
-XX:MaxTenuringThreshold=20参数设定送往老年代之前的次数,默认是15
-XX:PretenureSizeThreshold=3m参数设定直接送往老年代的对象大小,该参数无默认值
原文:https://www.cnblogs.com/kbhan/p/12315915.html