GC(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cpongo4/article/details/89227268
48618653_p0.png

原创文章,转载请注明出处

《垃圾回收的算法与实现》笔记

GC 复制算法

  • 只把某个空间里的活动对象复制到其他空间,把原空间里的所有对象都回收掉。

名词解释:

From 空间 :复制对象的原空间。

To 空间 :粘贴活动对象的新空间。

当 From 空间被完全占满时, GC 会将活动对象全部复制到 To 空间。当复制对象全部完成后,此算法会把 From 空间和 To 空间互换,GC 也就结束了。 From 空间必须和 To 空间大小完全一致。

GC 复制算法的 copying() 函数

1
2
3
4
5
6
7
8
9
10
11
copying() {
//$free 分块开头的变量,并设置在 To 空间的开头
$free = $to_start
//复制能从根引用的对象
for (r : $roots) {
*r = copy(*r)
}

//swap : 交换两个对象
swap($from_start, $to_start)
}

GC 复制算法的 copy() 函数(copy() 函数将作为参数给出的对象复制,再递归复制其子对象)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
copy(obj) {
//检查 obj 的复制是否已经完成,obj.tag 是一个域,表示 obj 的复制是否完成。obj.tag 是obj.field1 的别名
if (obj.tag !=COPIED) {
copy_data($free, obj, obj.size)
obj.tag = COPIED
obj.forwarding = $free
$free += obj.size
}

for (child : children(obj.forwarding)) {
*child = copy(*child)
}

return obj.forwarding
}

GC 复制算法的优缺点

优点

  • 优秀的吞吐量

    它只搜索并复制活动对象,堆越大,差距越明显。

  • 可实现高速分配

  • 不会发生碎片化

  • 与缓存兼容

缺点

  • 堆使用效率低下
  • 不兼容保守式 GC 算法
  • 递归调用函数

猜你喜欢

转载自blog.csdn.net/cpongo4/article/details/89227268
GC