Garbage Collection | 引用计数算法

时隔半个月了,距离上一次更新博文后,个人技术方向遇到瓶颈,失去研究方向后的感觉确实不好受。在一次偶然的问答中,发现自己对gc技术算法甚是模糊,总算找回了一点目标。

引用计数算法


这是一个比较直接的算法,其基本手段是为每一个单元计算指向它的引用(来自其他活动单元或者根)的数量【Collins,1960】.它的优点在于能够非常简单的判断单元是否正在使用。它还天生是一个渐进式的技术,能够将内存管理的开销分布到整个程序之中。基于引用计数的算法被许多语言和应用所采纳,例如,面向对象语言Smalltalk的早期版本,InterLisp与Adobe Photoshop。许多操作系统(如UNIX)也用这一方法来判断一个文件是否可以被删除。
从本质上来说,基于引用计数算法的垃圾收集器的工作策略。与那些基于追踪的垃圾收集器完全不同。每个单元都有一个额外的域,存放引用计数值。内存管理器必须为每一个单元维护引用计数值,使其等于指向该单元的指针的数量。首先,这一算法把所有的单元放在一个自由单元池里,这个池的实作常常是一个链表,连同一个指向链表表头的指针。当然,我们不一定非得为此专门增加一个next域(每个单元有一个指针域,简称next域,所有单元通过此链接成一条长链)。通常,它与保存引用计数值的域是同一个域—-自由单元并不需要明确的引用计数值。或者,我们也可以使用单元中某个保存用户数据的域。


1.0 简单引用计数算法


自由单元的引用计数值为0,当一个新单元从池中被分配的时候,它的引用计数值被设为1.每次有一个指针被设为指向这一单元时,该单元的计数值加1;而每次删除某个指向它的指针时,它的计数值减1。如果单元的计数值降为0,引用计数不变式告诉我们不再存在指向该单元的指针。更进一步,由于这个单元的位置被“丢失”,因此,也就不存在任何手段重新建立与这个单元的联系。程序已经不再需要这个单元,可以将其放回自由单元的列表了。

现在,让我们仔细地看一下这个算法。allocate是作为一个堆中分配空间的通用机制。在这里,它从自由链表中弹出第一个元素。New从自由链表中取出一个新单元,先把它的引用计数值置1,然后将

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值