有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么CMS是为了最初的标志而不是为了扫除阶段而停止世界?

完整GC共有4个高级阶段CMS工程

  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-mark-and-sweep

我的问题是为什么初始标记阶段是Initial Mark阶段的STW?既然这是和解的最后阶段,我们就不能把这一阶段定为STW吗

同样地,为什么Sweeping phase不是STW,因为它需要压缩,这意味着对象的物理位置发生变化。所以如果对象由app和concurrent引用 线程改变了物理位置,这不是问题吗

我知道我遗漏了什么但那是什么


共 (1) 个答案

  1. # 1 楼答案

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

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

    从理论上讲,你可以省略STW作为初始标记,因为扫描它的同时有丢失几个根的风险(不管怎样,在最后的评论中都会恢复)。尽管这里有退路

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

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

    Here is my article explaining nature and asymptotics of CMS GC pauses