论文: 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%。
时间: 2024-10-16 18:50:29