java - 并发标记和清除算法

标签 java garbage-collection concurrent-mark-sweep

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

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/

相关文章:

Java ConcurrentMarkSweep 垃圾收集器未发生

java - 什么时候有人会在多核机器上使用带有 CMS 垃圾收集器的单线程?

java - 获取错误 "Object doesn' t 支持属性或方法 'attachEvent'“在 IE11 中但在 IE8、IE9、IE10 中工作

java - Class 对象什么时候被垃圾回收?

用于详细 gc 的 Linux 命令

garbage-collection - 比较和交换有无垃圾收集器

java - 尽管有 UseCMSInitiatingOccupancyOnly 标志,CMS-initial-mark 仍在增加,并导致并发模式失败

java - 在java中访问其他方法变量?

java - IBM Liberty Server 每个请求允许的最大参数异常

java - Firebase查询不返回它匹配的值