我通过https://plumbr.eu/handbook/garbage-collection-algorithms-implementations/concurrent-mark-and-sweep链接解释了CMS GC,但不了解Concurrent Abortable Preclean在做什么,如果有人详细解释它会有所帮助。

最佳答案

博客文章Understanding CMS GC Logs提到了(不可中断)预清理阶段的目的:


预清洗也是一个并发阶段。在此阶段中,我们查看CMS堆中的对象,这些对象在上一个并发标记阶段进行并发标记时,已通过年轻代升级或新分配的升级进行了更新,或通过变异器进行了更新。通过同时重新扫描这些对象,预清理阶段有助于减少下一个停产“备注”阶段的工作。


因此,该阶段是一个优化。

然后将可终止的预清洗描述为


在“并发预清理”之后,如果Eden占用率高于CMSScheduleRemarkEdenSizeThreshold,则开始“并发可中止的预清理”并继续进行预清理,直到在eden中拥有CMSScheduleRemarkEdenPenetration占用百分比,否则我们立即安排“注释”阶段。


The Unspoken - CMS and PrintGCDetails的另一篇文章进一步提到:


安排了备注阶段,以使其不会与ParNew背靠背发生,从而不会出现一个暂停,它是ParNew和备注暂停之和。备注阶段准备开始时,第二个预清洁阶段开始并且中止。中止第二个预清洁阶段是预期的行为。它被中止并不表示错误。由于评论阶段正在等待,为什么不进行预清洗,但为了进行预清洗就不要延迟评论。


换句话说,可中止的预清洗是一种优化(预清洗优化的一种),用于在年轻集合之间分隔备注停顿并以一种有用的方式花费等待时间。

关于garbage-collection - 有人可以解释CMS垃圾收集的“并发可终止预清理”阶段发生了什么吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44182733/

10-10 11:26