2

CMS 有 4 个高级阶段适用于完整的 GC

  1. 初始标记:- 停止世界(STW)
  2. 并发标记:-同时运行
  3. 备注 :- STW
  4. 并发扫描:- 并发运行

阅读后我对CMS有了高度的了解

http://www.tikalk.com/java/garbage-collection-serial-vs-parallel-vs-concurrent-mark-sweep/https://plumbr.eu/handbook/garbage-collection-algorithms-implementations/concurrent -标记和扫描

我的问题是为什么初始标记阶段是 STWInitial Mark阶段?我们不能将 Remark 阶段设置为 STW,因为这是和解的最后阶段。

同样,为什么Sweeping phase不是 STW,因为它需要压缩,这意味着对象的物理位置的变化。因此,如果应用程序引用了对象并且并发线程更改了物理位置,那不是问题吗?

我知道我在这里遗漏了一些东西,但那是什么?

4

1 回答 1

1

我假设您指的是 Oracle 的 HotSpot JVM 中的并发标记扫描实现。

初始标记阶段包括扫描年轻空间(任何年轻到老的引用都是并发标记的根)。备注阶段包括完全相同的操作。

理论上,您可以省略 STW 作为初始标记,因为它同时扫描它,同时存在丢失少量根的风险(这将在最终评论期间以任何方式恢复)。虽然这里有缺点

  • 由于年轻收集正在移动对象,因此内存扫描可能不准确。老收集器和年轻收集器之间的同步会变得更加复杂。
  • 如果在不准确的初始标记期间遗漏了某些根,则注释可能会变得明显更长,因为它涉及遍历从新找到的根可到达的对象。

清扫不需要 STW,因为它不紧凑。CMS 不会在并发周期中压缩旧空间。

这是我解释 CMS GC 暂停的性质和渐近的文章

于 2016-09-26T18:12:19.167 回答