CMS GC的初始标记阶段到底标记了哪些对象?

最近在看CMS GC,发现不同文章对CMS GC的初始标记阶段(initial mark)阶段的描述不一。

文章一

https://plumbr.io/handbook/ga...

clipboard.png

mark all the objects in the Old Generation that are either direct GC roots or are referenced from some live object in the Young Generation

按该文章阐述:
初始标记阶段,标记所有GCRoot直达的老年代对象和被年轻代对象直接引用的老年代对象。
说明初始标记阶段只标记老年代对象。


文章二

http://www.cnblogs.com/little...

clipboard.png

按该文章阐述:
初始标记阶段,标记所有GCRoot直达的对象,GCRoot可达的对象包括年轻代和老年代对象。


文章三

https://blogs.oracle.com/poon...

clipboard.png

按该文章阐述:
标记的也是所有GCRoot直达的对象。


请问:
CMS GC的初始标记阶段到底标记了哪些对象?
求推荐高质量的关于CMS GC的文章和论文。
阅读 5.8k
1 个回答

CMS 初始标记 其实就是 GC Roots 枚举的过程,所以需要stop the world。进行初始标记,就是要把 可达性分析(并发标记和重复标记)时,要用到的根节点标识出来。

那被标识的对象,肯定是包括 堆外直接引用的老年代对象新生代引用的老年代对象,即是 GC Roots集合 与 跨代引用对象

GC Roots 根本就没有一个统一的定义,只有一个肯定的目的。它的目的,就是作为 可达性分析 的根节点。所以,不同的人描述 初始标记时,会发生混乱。

第一个描述,明显认为 GC Roots 不包括 跨代引用,所以把它们都列出了。

第二、三个描述,则认为 GC Roots 包含了 跨代引用

实际上,所表达的意思,都是 CMS 进行 可达性分析 时的 根节点合集 。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题