来自plumbr's cookbook ,我已经看到了初始化标记、并发标记、并发预清理和并发可中止预清理的作用。
初始标记
但我无法真正了解“最后的评论”。只再次遍历老年代?如果这样做的话,我认为前面的步骤就没有必要了。
最佳答案
并发标记清除有 4 个主要阶段。
- 初始标记
- 并发标记/并发预清理
- 最后一句话
- 扫一扫
并发标记清除的附加细节 - 年轻空间中的所有对象都被视为 GC 根。
并发标记是并发的主要原因是因为遍历旧空间中的对象图需要大量时间。 尽管后续标记要快得多,因为大多数对象已经标记并且不需要重新访问。
并发操作仍然无法保证一致的标记,因为线程继续更改对象图。需要停止世界才能 catch 。
“最后的评论”是涉及完整标记(根扫描+递归遍历)的停止世界阶段,但由于大多数对象已经被并发标记/预清理标记,因此递归遍历阶段通常很快。
您可以在我的 Understanding GC pauses in JVM, HotSpot's CMS collector 中找到更多详细信息文章。
关于java - "final remark"中CMS的具体工作是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57302294/