并行标记和扫描算法

时间:2015-09-29 04:07:59

标签: java garbage-collection concurrent-mark-sweep

以下是我读到的内容了解并发标记和扫描算法

1)在初始标记中,GC根对象被标记为活动。在此阶段,应用程序的所有线程都将被暂停。

2)在并发标记期间,遍历标记的根对象并标记所有可到达的对象。此阶段与应用程序执行完全并发,因此所有应用程序线程都处于活动状态,甚至可以分配新对象。因此,可能存在另一个阶段,该阶段标记在并发标记期间已分配的对象。这有时被称为预清理,并且仍然与应用程序执行同时完成。

3)在最终标记中,所有线程都被挂起,所有剩余的新分配对象都被标记为活动。

问题: 由于此算法中存在最终标记阶段,在此期间应用程序线程被暂停,因此与并行GC相比,此算法的速度如何更快?

1 个答案:

答案 0 :(得分:1)

  

那么与并行GC相比,该算法如何更快?

从垃圾回收中消耗的CPU周期来看,它并不快。它更快"从而与并行GC相比,它实现了更低的平均/第N百分位数暂停时间。

支付的价格是

  • 并发阶段会消耗更多CPU周期。
  • 缺乏压缩,导致碎片化,这可能最终导致所谓的并发模式故障,目前 - 这是一个单线程,停止世界的完整GC
    • 没有压缩也会使对象推广更加昂贵,因为它不能只使用凹凸指针分配
  • 更多,但更短,暂停

编辑,以获取后续问题:

初始和最终标记等同于STW标记扫描收集器的标记阶段。它们只是完整标记阶段的一部分。这意味着并非所有标记工作都在暂停期间完成。其余的是同时完成的。

  

那么这个标记使用所有的cpu核心,还是CMS中的单线程?

您可以通过比较CPU时间与墙上时间来解决这个问题。