首页 > 代码库 > 代际垃圾回收器的一种快速Write Barrier算法

代际垃圾回收器的一种快速Write Barrier算法

论文: A Fast Write Barrier for Generational Garbage Collectors

http://hoelzle.org/publications/write-barrier.pdf


老年代需要记录对新生代的对象引用,以便于新生代GC之后更改老年代相应位置的引用,不然就要扫描整个老年代了。这些标记称为Remembered Set。确保代际的引用位置被标记的机制称为Write Barrier或Store Check。

一般使用Card Marking算法,堆被分为很多card,每个card2^k个word(k=5,6,7),在32位上一般是128,256,或1024字节,每个card一个标记,每个store操作时如果对应card上的对象引用被更改,就把这个card标记,在回收阶段扫描这个card把引用改到最新。开始一个card的标记是一个bit,但性能不佳,改位1个byte,即便如此,内存的额外开销也不大。

初始时的marking需要三个SPARC命令:

st  [%obj + offset], %ptr
add %obj, offset, %temp
sll %temp, k, %temp
st  %g0, [%byte_map + %temp]

为了性能干脆搞成找到修改位置所在对象所在的card,这样只需要两个指令,但回收时候需要多扫描:

st  [%obj + offset], %ptr
sll %obj, k, %temp
st  %g0, [%byte_map + %temp]

marking占总的write barrier时间(还包括清除阶段扫描card)40%-100%,占总的GC开销的40%。

代际垃圾回收器的一种快速Write Barrier算法