垃圾收集:初始标记和并发标记

时间:2014-05-17 15:33:31

标签: java garbage-collection

Java中的Concurrent-Mark-Sweep垃圾收集器;我不清楚这两个阶段之间有什么不同。为什么需要并发标记?初始标记是否找不到所有活动对象?

1 个答案:

答案 0 :(得分:1)

使用CMS,所谓的3色标记算法用于标记活动对象。

  • white - unmarked
  • 灰色 - 标记了对象,但未处理其出站引用
  • 黑色 - 标记对象并处理所有出站引用

标记从灰色显示从可到达的对象开始,当没有更多灰色对象可用时,它被视为已完成。

CMS中的并发标记仅在旧空间中进行标记。因此,旧空间之外的所有引用都是根引用

他们是

  • 可用的局部变量是线程堆栈
  • 从年轻空间到旧
  • 的引用

由于只有旧空间适合并发标记,所有堆叠和年轻空间都应以世界各地的方式进行。这构成了CMS的initial-mark阶段。

完成initial-mark后,CMS在旧空间中有多个灰色对象以启动并发标记。在并发标记期间,如果应用程序线程修改了黑色对象,则它们可能会恢复为灰色。卡片标记编写器屏障允许CMS跟踪修改。

最后CMS正在进行另一次世界停留remark。备注再次重新扫描堆栈和年轻空间并完成旧空间的标记(大多数可到达的对象已经是黑色,因此标记相当快)。年轻的空间和堆栈不会被写屏障跟踪,因此CMS必须重新扫描它们才能找到旧空间的新引用。

remark完成后,旧空间中只有黑白物体,因此可以进行扫描。

您可以在this article中阅读有关CMS收集器的更多详细信息。