Ruby的GC机制源码分析(2)

停止与复制

停止与复制型GC 是标记与清除型GC 的一个变体。首先,准备多个对象域。为了简化讨论,假设只有两个域:AB 。将一边标记为“active” ,生成的对象都放到active 域中(图5 )。

停止与复制(1)
5: 停止与复制(1

执行GC 时,按照标记与清除同样的路径进行搜索。但是,与标记不同的是,对象本身移到了另外一个空间(图6 )。搜索全部链接之后,只要抛弃留在A 中的对象,将B 标记为active 即可。

停止与复制(2)
6: 停止与复制(2

停止与复制也有两个优点。

·         内存回收的同时一并完成压缩。

·         相互引用的对象会聚集在附近,有助于提高缓存的命中率

缺点也是两个。

·         需要两倍以上的对象域

·         对象的位置发生了变化

可见天下没有免费的午餐。

 

引用计数

引用计数不同于之前介绍的东西,它的检查分布在代码各处。

首先,为每个对象加上一个整数计数器。当变量或数组引用时,对象的计数器就会增加。停止引用时,计数器就会随之减少。计数器为0 时,就会释放。这便是引用计数的方法(图7 )。

引用计数
7: 引用计数

这种方法有两个优点。

·         GC 的负担分散到整个程序之中

·         不必需的对象能够立刻得到释放

缺点也是两个。

·         容易遗忘对计数器的操作

·         简单的方法无法处理环

这里解释一下第二点。环(cycle )指得是图8 所示的有循环引用关系的状态。变成这样的话,计数器便不会减少,也就绝对无法释放。

环
8:

顺便说一下,最新的Python2.2 )采用了引用计数,其中的环可以释放。但这并不是引用计数本身的力量,不过是时常采用标记与清除型GC 检查罢了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值