【发布时间】:2019-12-01 14:59:24
【问题描述】:
标准 CMS 算法首先让应用程序经历 STW 暂停以计算 GC 根集。然后它恢复 mutator 线程,应用程序和收集器线程同时运行,直到标记完成。任何由 mutator-thread 更新的指针存储都受写屏障保护,该写屏障将该指针引用添加到写队列。
标记阶段完成后,我们将进入重新标记阶段:它必须查看此写入队列并继续标记它在其中找到的尚未标记的任何内容。
所有这些都是有道理的。我不明白为什么我们需要:
- 让这个重新标记阶段从头开始重新计算 GC 根集(包括所有线程堆栈)——这样做不会导致算法不正确,因为它会将实际活动且可访问的对象标记为要回收的垃圾?;
- 此重新标记阶段是否是另一个 STW 事件(可能是因为必须分析所有线程堆栈?)
在阅读 CMS A Generational Mostly-concurrent Garbage Collector 上的一篇原始论文时,可以看到:
最初的大部分并发算法,由 伯姆等人。 [5],是一个并发的“三色”收集器 [9]。它 使用写屏障来更新堆对象的字段 将包含的对象设为灰色。它的主要创新是 它通过允许根位置(全局、堆栈、寄存器)来权衡完全并发以获得更好的吞吐量, 通常比堆位置更频繁地更新,在不使用屏障维护的情况下编写 三色不变量。
这看起来只是一种权衡,源于有意识地决定不涉及写入屏障中堆栈上发生的事情?
谢谢
【问题讨论】:
-
这个问题一点也不坏。请记住,
CMS已被弃用,没有人支持它......
标签: garbage-collection jvm vm-implementation hotspot