Ruby的GC机制源码分析(2)
2010-12-18 13:48
162 查看
停止与复制
停止与复制型GC
是标记与清除型GC
的一个变体。首先,准备多个对象域。为了简化讨论,假设只有两个域:A
和B
。将一边标记为“active”
,生成的对象都放到active
域中(图5
)。
![](http://hi.csdn.net/attachment/201012/18/0_1292651211q9Lq.gif)
图5:
停止与复制(1
)
执行GC
时,按照标记与清除同样的路径进行搜索。但是,与标记不同的是,对象本身移到了另外一个空间(图6
)。搜索全部链接之后,只要抛弃留在A
中的对象,将B
标记为active
即可。
![](http://hi.csdn.net/attachment/201012/18/0_12926512172P3S.gif)
图6:
停止与复制(2
)
停止与复制也有两个优点。
·
内存回收的同时一并完成压缩。
·
相互引用的对象会聚集在附近,有助于提高缓存的命中率
缺点也是两个。
·
需要两倍以上的对象域
·
对象的位置发生了变化
可见天下没有免费的午餐。
引用计数
引用计数不同于之前介绍的东西,它的检查分布在代码各处。
首先,为每个对象加上一个整数计数器。当变量或数组引用时,对象的计数器就会增加。停止引用时,计数器就会随之减少。计数器为0
时,就会释放。这便是引用计数的方法(图7
)。
![](http://hi.csdn.net/attachment/201012/18/0_1292651226nCip.gif)
图7:
引用计数
这种方法有两个优点。
·
GC
的负担分散到整个程序之中
·
不必需的对象能够立刻得到释放
缺点也是两个。
·
容易遗忘对计数器的操作
·
简单的方法无法处理环
这里解释一下第二点。环(cycle
)指得是图8
所示的有循环引用关系的状态。变成这样的话,计数器便不会减少,也就绝对无法释放。
![](http://hi.csdn.net/attachment/201012/18/0_1292651239wmS0.gif)
图8:
环
顺便说一下,最新的Python
(2.2
)采用了引用计数,其中的环可以释放。但这并不是引用计数本身的力量,不过是时常采用标记与清除型GC
检查罢了。
停止与复制型GC
是标记与清除型GC
的一个变体。首先,准备多个对象域。为了简化讨论,假设只有两个域:A
和B
。将一边标记为“active”
,生成的对象都放到active
域中(图5
)。
![](http://hi.csdn.net/attachment/201012/18/0_1292651211q9Lq.gif)
图5:
停止与复制(1
)
执行GC
时,按照标记与清除同样的路径进行搜索。但是,与标记不同的是,对象本身移到了另外一个空间(图6
)。搜索全部链接之后,只要抛弃留在A
中的对象,将B
标记为active
即可。
![](http://hi.csdn.net/attachment/201012/18/0_12926512172P3S.gif)
图6:
停止与复制(2
)
停止与复制也有两个优点。
·
内存回收的同时一并完成压缩。
·
相互引用的对象会聚集在附近,有助于提高缓存的命中率
缺点也是两个。
·
需要两倍以上的对象域
·
对象的位置发生了变化
可见天下没有免费的午餐。
引用计数
引用计数不同于之前介绍的东西,它的检查分布在代码各处。
首先,为每个对象加上一个整数计数器。当变量或数组引用时,对象的计数器就会增加。停止引用时,计数器就会随之减少。计数器为0
时,就会释放。这便是引用计数的方法(图7
)。
![](http://hi.csdn.net/attachment/201012/18/0_1292651226nCip.gif)
图7:
引用计数
这种方法有两个优点。
·
GC
的负担分散到整个程序之中
·
不必需的对象能够立刻得到释放
缺点也是两个。
·
容易遗忘对计数器的操作
·
简单的方法无法处理环
这里解释一下第二点。环(cycle
)指得是图8
所示的有循环引用关系的状态。变成这样的话,计数器便不会减少,也就绝对无法释放。
![](http://hi.csdn.net/attachment/201012/18/0_1292651239wmS0.gif)
图8:
环
顺便说一下,最新的Python
(2.2
)采用了引用计数,其中的环可以释放。但这并不是引用计数本身的力量,不过是时常采用标记与清除型GC
检查罢了。
相关文章推荐
- Ruby的GC机制源码分析(1)
- Ruby的GC机制源码分析(2)
- Ruby的GC机制源码分析(3)
- Ruby的GC机制源码分析(4)
- Ruby的GC机制源码分析(1)
- Ruby的GC机制源码分析(3)
- Ruby的GC机制源码分析(4)
- Android 源码分析 -- Binder机制
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- nginx源码分析之事件机制
- android的消息处理机制(图文+源码分析)—Looper/Handler/Message
- Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析 《二》
- 深度分析 Java 的 ClassLoader 机制(源码级别)
- Android触摸屏事件派发机制详解与源码分析一(View篇)
- OpenStack建立实例完整过程源码详细分析(12)----依据AMQP通信架构实现消息发送机制解析之一
- MVVMLight源码分析之消息机制和ViewModelBase
- Handler消息机制源码分析
- Android IPC 通讯机制源码分析 (二)
- SolrCloud查询源码分析以及通信机制
- 源码分析RocketMQ之CommitLog消息存储机制