基本概念
对象/头/域
mutator
根(root)
算法
Cheney的GC复制算法
Cheney的GC复制算法不是递归地,而是迭代地进行复制。1
2
3
4
5
6
7
8
9
10
11copying(){
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 | copy(obj){ |
首先在第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
源码
参考
- V8 —— 你需要知道的垃圾回收机制
https://juejin.im/post/5b398981e51d455e2c33136b - 解读 V8 GC Log(二): 堆内外内存的划分与 GC 算法
https://yq.aliyun.com/articles/592880?spm=a2c4e.11153959.0.0.abf75fbdaPONjd - 垃圾回收的算法和实现