以下是我对并发标记和清除算法的阅读和理解
1) 在初始标记中,GC 根对象被标记为存活。在此阶段,应用程序的所有线程都被挂起。
2)并发标记时,会遍历已标记的根对象,标记所有可达对象。此阶段与应用程序执行完全并发,因此所有应用程序线程都处于 Activity 状态,甚至可以分配新对象。因此,可能存在另一个阶段来标记并发标记期间已分配的对象。这有时称为预清理,并且仍然与应用程序执行同时完成。
3) 在最终标记中,所有线程都被挂起,所有剩余的新分配的对象被标记为 Activity 的。
问题: 由于该算法中有一个最终标记阶段,在此期间应用程序线程会被挂起,那么与并行 GC 相比,该算法如何更快?
最佳答案
so how does this algorithm is faster in comparison to the parallel GC ?
从垃圾收集消耗的 CPU 周期的意义上来说,它并没有更快。与并行 GC 相比,它“更快”,因为它实现了更低的平均/第 N 个百分位数暂停时间。
为此付出的代价是
- 并发阶段消耗了更多 CPU 周期。
- 缺乏压缩,这会导致碎片,最终可能导致所谓的并发模式故障,目前是单线程、stop-the-world full GC
- 缺乏压缩也会使对象升级更加昂贵,因为它不能只使用凹凸指针分配
- 更多但更短的停顿
编辑您的后续问题:
初始和最终标记不等同于 STW 标记-清除收集器的标记阶段。它们只是完整标记阶段的一部分。这意味着并非所有标记工作都是在暂停期间完成的。其余部分同时完成。
So this markup uses all the cpu cores or it is single threaded in CMS ?
您可以通过比较 CPU 时间和挂机时间来自行计算出这一点。
关于java - 并发标记和清除算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835534/