java为什么CMS是为了最初的标志而不是为了扫除阶段而停止世界?
完整GC共有4个高级阶段CMS工程
- 初始标记:-停止世界(STW)
- 并发标记:-并发运行
- 备注:-STW
- 并发扫描:-并发运行
通过阅读,我对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 楼答案
我假设您指的是Oracle的HotSpot JVM中的并发标记扫描实现
初始标记阶段包括扫描年轻空间(任何年轻到老的引用都是并发标记的根)。备注阶段包括非常相同的操作
从理论上讲,你可以省略STW作为初始标记,因为扫描它的同时有丢失几个根的风险(不管怎样,在最后的评论中都会恢复)。尽管这里有退路
清扫不需要STW,因为它不紧凑。CMS不会在并发循环中压缩旧空间
Here is my article explaining nature and asymptotics of CMS GC pauses