v8 GC

基本概念

对象/头/域


mutator

根(root)

算法

Cheney的GC复制算法

Cheney的GC复制算法不是递归地,而是迭代地进行复制。

1
2
3
4
5
6
7
8
9
10
11
copying(){
scan = $free = $to_start
for(r : $roots)
*r = copy(*r)

while(scan != $free)
for(child : children(scan))
*child = copy(*child)
scan += scan.size

swap($from_start, $to_start) }

在第2行将scan和$free的两个指针初始化。scan 是用于搜索复制完成的对象的指针。$free是指向分块开头的指针。
首先复制的是直接从根引用的对象,用到的是第3行和第4行。
在第6行到第9行搜索复制完成的对象,迭代复制其子对象。最后把From空间和 To空间互换就结束了。Cheney的GC复制算法中的关键点仍是copy()函数。

1
2
3
4
5
6
copy(obj){
if(is_pointer_to_heap(obj.forwarding, $to_start) == FALSE)
copy_data($free, obj, obj.size) obj.forwarding = $free
$free += obj.size
return obj.forwarding
}

首先在第2行检查参数obj是不是已经复制完毕了。
对于is_pointer_to_heap(obj.forwarding, $to_start),如果 obj.forwarding 是指向To空间的指针则返回TRUE,如果不是(即非指针或指向From空间的指针)则返回FALSE。
在第3行复制对象,在第4行对forwarding指针进行设定。forwarding指针利用的是field1。





分代垃圾回收









Write Barrier


增量式垃圾回收(Incremental GC)

描述增量式垃圾回收的算法时我们有个方便的概念,那就是Edsger W. Dijkstra等人提出的三色标记算法(Tri-color marking)

V8使用每个对象的两个mark-bits和一个标记工作栈来实现标记。两个mark-bits编码三种颜色:白色(00),灰色(10)和黑色(11)。






Write Barrier


源码

参考