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 文章中找到更多详细信息。
从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 文章中找到更多详细信息。