4

I wonder why CMS needs two phases (and so two pauses) of marks: i.e. initial mark and remark. Can we simply do one mark and then perform sweep? I imagine this can be a faster pause. Can someone help explain what is the main purpose of the second mark and why we need it? Thanks!

4

1 回答 1

6

HotSpot 内存管理白皮书对此进行了很好的解释:

CMS 收集器的收集周期以短暂的暂停开始,称为初始标记,它标识可从应用程序代码直接访问的初始活动对象集。然后,在并发标记阶段,收集器标记从该集合中可传递到达的所有活动对象。因为在标记阶段发生时应用程序正在运行并更新引用字段,所以不能保证在并发标记阶段结束时标记所有活动对象。为了处理这个问题,应用程序再次停止第二次暂停,称为 remark,它通过重新访问在并发标记阶段修改的任何对象来完成标记。由于remark pause 比初始mark 更显着,因此并行运行多个线程以提高其效率。

于 2013-06-28T19:39:26.443 回答