为什么JVM CMS(并发标记和清除)需要两次暂停GC?

yuy*_*ang 3 java garbage-collection concurrent-mark-sweep

我想知道为什么CMS需要两个阶段(以及两个暂停)的标记:即初始标记和备注.我们可以简单地做一个标记然后执行扫描吗?我想这可能是一个更快的停顿.有人可以帮助解释第二个标记的主要目的是什么以及我们为什么需要它?谢谢!

Mar*_*nik 5

这在HotSpot内存管理白皮书中得到了很好的解释:

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