CMS在"final remark"中的具体工作是什么?

What is the concrete job in "final remark" about CMS?

plumbr's cookbook,我看到了init mark、concurrent mark、concurrent preclean和concurrent abortable preclean的作用。

初始标记

并发标记

并发预清理

但我无法获得有关 "final remark" 的真正工作。只遍历老年代?如果是这样的话,我觉得前面的步骤就没有必要了。

并发标记清除有 4 个主要阶段。

  • 初始标记
  • 并发标记/并发预清理
  • 最后的评论
  • 扫一扫

Concurrent Mark Sweep 的附加细节 - 年轻 space 中的所有对象都被视为 GC 根。

并发标记 并发 的主要原因是因为在旧 space 中遍历对象图需要很长时间。 尽管后续标记要快得多,因为大多数对象已经标记并且不需要重新访问。

仍然并发操作不能保证标记一致,因为线程继续更改对象图。需要停止世界才能赶上。

"Final remark" 是一个涉及完整标记(根扫描+递归遍历)的停止世界阶段,但是由于大多数对象已经被并发标记 mark/preclean 递归遍历阶段通常很快。

您可以在我的 Understanding GC pauses in JVM, HotSpot's CMS collector 文章中找到更多详细信息。