[HotSpot VM] 关于incremental update与SATB的一点理解

CMS和G1算法都涉及对可达对象的并发标记。并发标记的主要问题是collector在标记对象的过程中mutator可能正在改变对象引用关系图,从而造成漏标和错标。错标不会影响程序的正确性,只是造成所谓的浮动垃圾。但漏标则会导致可达对象被当做垃圾收集掉,从而影响程序的正确性。
为解决漏标问题,GC Handbook一书首先将对象分为三类,即所谓的black对象,grey对象和white对象。white对象是那些还没有被collector标记到的对象;grey对象是那些自身已经被标记到,但其所有引用字段还没有处理的对象;而black对象则是自身已经被标记到,且其引用的所有对象也已经被标记的对象。

基于上述分类,一个white对象在并发标记阶段会被漏标的充分必要条件是:
1、mutator插入了一个从black对象到该white对象的新引用
2、mutator删除了所有从grey对象到该white对象的直接或者间接引用。
因此,要避免对象的漏标,只需要打破上述2个条件中的任何一个即可。

Incremental update关注的是第一个条件的打破,即引用关系的插入。Incremental update利用write barrier将所有新插入的引用关系都记录下来,最后以这些引用关系的src为根STW地重新扫描一遍即避免了漏标问题。
SATB关注的是第二个条件的打破,即引用关系的删除。SATB利用pre write barrier将所有即将被删除的引用关系的旧引用记录下来,最后以这些旧引用为根STW地重新扫描一遍即可避免漏标问题。

不知我的上述理解是否正确,请R大指点。
一个疑问就是http://hllvm.group.iteye.com/group/topic/44381?page=2中,
R大 写道
CMS的remark需要重新扫描mod-union table里的dirty card外加整个根集合
为什么还要“外加”扫描“整个根集合”。R大这里所说的根集合是指stack、register、global object这样的根吗,还是另有所指??
共 8 条回复