7,下一阶段是CMS-concurrent-abortable-preclean阶段,加入此阶段的目的是使cms gc更加可控一些,作用也是执行一些预清理,以减少Rescan阶段造成应用暂停的时间
?? ?? ??此阶段涉及几个参数:
?? ??????-XX:CMSMaxAbortablePrecleanTime:当abortable-preclean阶段执行达到这个时间时才会结束
?? ?? ??-XX:CMSScheduleRemarkEdenSizeThreshold(默认2m):控制abortable-preclean阶段什么时候开始执行,
?? ?? ?? 即当eden使用达到此值时,才会开始abortable-preclean阶段
?? ?? ??-XX:CMSScheduleRemarkEdenPenetratio(默认50%):控制abortable-preclean阶段什么时候结束执行
?? ?? ?? 此阶段会打印一些日志如下:
?? ?? ??CMS-concurrent-abortable-preclean-start,CMS-concurrent-abortable-preclean,
?? ?? ?? CMS:abort preclean due to time XXX
8,再下一个阶段是第二个stop the world阶段了,即Rescan阶段,此阶段暂停应用线程,停顿时间比并发标记小得多,但比初始标记稍长。对对象进行重新扫描并标记;
?? ?? ?? ??YG occupancy:964861K(2403008K),指执行时young代的情况
?? ?? ?? ??CMS remark:961330K(1572864K),指执行时old代的情况
?? ?? ?? 此外,还打印出了弱引用处理、类卸载等过程的耗时
?? ?? ?? ??A,concurrent-mode-failure:预清理阶段可能出现,当cms gc正进行时,此时有新的对象要进行old代,但是old代空间不足造成的。其可能性有:1,O区空间不足以让新生代晋级,2,O区空间用完之前,无法完成对无引用的对象的清理。这表明,当前有大量数据进入内存且无法释放。
?? ?? ?? ??B,promotion-failed:新生代young gc可能出现,当进行young gc时,有部分young代对象仍然可用,但是S1或S2放不下,因此需要放到old代,但此时old代空间无法容纳此。
?? ?? ?? ????-XX:CMSMaxAbortablePrecleanTime=5000
?? ?? ?? ????-XX:CMSInitiatingOccupancyFraction=80
?? ?? ?? A,针对cms gc的触发阶段,调整-XX:CMSInitiatingOccupancyFraction=50,提早触发cms gc,就可以缓解当old代达到80%,cms gc处理不完,从而造成concurrent mode failure引发full gc
?? ?? ??B,修改-XX:CMSMaxAbortablePrecleanTime=500,缩小CMS-concurrent-abortable-preclean阶段的时间
?? ?? ??C,考虑到cms gc时不会进行compact,因此加入-XX:+UseCMSCompactAtFullCollection
?? ?? ?? ??(cms gc后会进行内存的compact)和-XX:CMSFullGCsBeforeCompaction=4(在full g次后会进行compact)参数
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-72744-7.html
马云创业时
豆子都是找大口塑料瓶子装着