Java中的Concurrent-Mark-Sweep垃圾收集器;我不清楚这两个阶段之间有什么不同。为什么需要并发标记?初始标记是否找不到所有活动对象?
答案 0 :(得分:1)
使用CMS,所谓的3色标记算法用于标记活动对象。
标记从灰色显示从根可到达的对象开始,当没有更多灰色对象可用时,它被视为已完成。
CMS中的并发标记仅在旧空间中进行标记。因此,旧空间之外的所有引用都是根引用。
他们是
由于只有旧空间适合并发标记,所有堆叠和年轻空间都应以世界各地的方式进行。这构成了CMS的initial-mark
阶段。
完成initial-mark
后,CMS在旧空间中有多个灰色对象以启动并发标记。在并发标记期间,如果应用程序线程修改了黑色对象,则它们可能会恢复为灰色。卡片标记编写器屏障允许CMS跟踪修改。
最后CMS正在进行另一次世界停留remark
。备注再次重新扫描堆栈和年轻空间并完成旧空间的标记(大多数可到达的对象已经是黑色,因此标记相当快)。年轻的空间和堆栈不会被写屏障跟踪,因此CMS必须重新扫描它们才能找到旧空间的新引用。
remark
完成后,旧空间中只有黑白物体,因此可以进行扫描。
您可以在this article中阅读有关CMS收集器的更多详细信息。