GC(三)

本文深入解析了垃圾回收中的GC复制算法,介绍了From空间与To空间的概念,阐述了复制算法的工作流程,包括copying()和copy()函数的具体实现,以及算法的优缺点分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 算法
  • 递归调用函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值