1

以下是我对并发标记和扫描算法的阅读和理解

1)在初始标记中,GC根对象被标记为活动的。在这个阶段,应用程序的所有线程都被挂起。

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

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

问题: 由于该算法有一个最终标记阶段,在此期间应用程序线程被挂起,那么与并行 GC 相比,该算法如何更快?

4

1 回答 1

1

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

就垃圾收集时消耗的 CPU 周期而言,它并没有更快。从某种意义上说,与并行 GC 相比,它实现了更低的平均/第 N 个百分位数暂停时间,因此它“更快”。

为此付出的代价是

  • 在并发阶段消耗更多的 CPU 周期。
  • 缺乏压缩,导致碎片化,最终可能导致所谓的并发模式故障,目前是单线程的、stop-the-world 的完整 GC
    • 没有压缩也使得对象提升更加昂贵,因为它不能只使用凹凸指针分配
  • 更多但更短的停顿

编辑,为您的后续问题:

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

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

您可以通过将 CPU 时间与挂墙时间进行比较来自己弄清楚这一点。

于 2015-09-29T14:52:57.573 回答