数组动态扩容导致频繁FGC
参数:-XX:CMSScavengeBeforeRemark
含义:
Enable scavenging attempts before the CMS remark step.
开启或关闭在CMS重新标记阶段之前的清除(YGC)尝试
CMS并发标记阶段与用户线程并发进行,此阶段会产生已经被标记了的对象又发生变化的情况,若打开此开关,可在一定程度上降低CMS重新标记阶段对上述“又发生变化”对象的扫描时间,当然,“清除尝试”也会消耗一些时间
注,开启此开关并不会保证在标记阶段前一定会进行清除操作
CMS重新标记前,进行YGC清除操作
先不打开CMSScavengeBeforeRemark 参数;
可以看出发生FGC的时候,并没有触发YGC,所以老年代的对象一直回收不了,因为老年代进行GC时,会把新生代的对象作为GC root,在本场景中,新生代的对象不回收,老年代的对象也无法回收,而且老年代的内存使用率已经超过设置的阈值90%,所以会不断的进行FGC。
然后 JVM参数中添加-XX:+CMSScavengeBeforeRemark,打开重新标记前进行YGC
YGC实现过程
新生代内存分配失败触发YGC
如果是因为新生代内存分配失败触发YGC时&#x