最近在看CMS GC,发现不同文章对CMS GC的初始标记阶段(initial mark)阶段的描述不一。
文章一
https://plumbr.io/handbook/ga...
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...
按该文章阐述:
初始标记阶段,标记所有GCRoot直达的对象,GCRoot可达的对象包括年轻代和老年代对象。
文章三
https://blogs.oracle.com/poon...
按该文章阐述:
标记的也是所有GCRoot直达的对象。
请问:
CMS GC的初始标记阶段到底标记了哪些对象?
求推荐高质量的关于CMS GC的文章和论文。
CMS
初始标记
其实就是 GC Roots 枚举的过程,所以需要stop the world
。进行初始标记,就是要把可达性分析
(并发标记和重复标记)时,要用到的根节点标识出来。那被标识的对象,肯定是包括
堆外直接引用的老年代对象
和新生代引用的老年代对象
,即是GC Roots
集合 与跨代引用对象
。GC Roots 根本就没有一个统一的定义,只有一个肯定的目的。它的目的,就是作为
可达性分析
的根节点。所以,不同的人描述初始标记
时,会发生混乱。第一个描述,明显认为
GC Roots
不包括跨代引用
,所以把它们都列出了。第二、三个描述,则认为
GC Roots
包含了跨代引用
。实际上,所表达的意思,都是 CMS 进行
可达性分析
时的根节点
合集 。