ParNew+CMS垃圾回收器触发老年代回收的条件,即触发full gc的条件
老年代回收其实属于full gc,full gc还包括新生代回收和元空间回收
4个条件:
1.young gc前检查,若老年代可用连续内存空间小于新生代所有对象总和并且老年代可用连续内存空间小于新生代历次young gc后升入老年代的对象总和的平均大小,则先不执行young gc,而直接执行full gc
2.young gc后,存活对象在survivor区放不下,准备进入老年代,但老年代也放不下,此时执行一次full gc
3.老年代内存使用率超过了阈值 –XX:CMSInitiatingOccupancyFaction,默认92%
4.元数据空间满了;
jvm gc日志读取核心逻辑
若eden区为8M,两个survivor区分别为1M,老年代为10M。此时老年代已有4M垃圾,但还未执行full gc,往eden区陆续加入2M,2M,2M,128K,2M,加最后一个2M时,会触发young gc,此时日志大概会显示
0.308: [ParNew (promotion failed): 7260K->7970K(9216K), 0.0048975 secs]
Eden区原来是有7000多KB的对象,但是回收之后发现一个都回收不掉,此时一定会直接把这些存活对象2M,2M,2M,128K放入到老年代里去,但老年代只剩约6M连续可用空间,放不下了,陆续加2M,2M,2M