垃圾回收机制的算法实现——引用计数算法

15 篇文章 1 订阅

一、引用计数器

在分析引用计数算法前,必须先引入引用计数器这个概念。引用计数器,其实就是对资源(GC主要是指内存中的对象或者说内存单元)的使用数量进行计算,也就是说对引用数量进行计算。如果这个计数器大于0说明这个内存对象正在被使用,反之,这块内存就可以释放回收了。

二、优缺点

引用计数算法的优点主要有如下几点:
1、速度快,可以随时发现不可用内存进行处理。
2、最大暂停时间短,这其实和垃圾数量即来即走有关系。
3、不需要进行遍历搜索。
但它也有不少的缺点:
1、计数器本身占用空间。
2、在数量多增减频繁的情况下降低效率。
3、实现起来有复杂度,比如在处理多线程时,如何保障原子性等。
4、难以处理循环引用这种问题。

三、基本应用

目前主要的引用计数算法有以下几种:
1、普通的引用计数器算法
普通的引用计数器算法,一般在内存对象中设置一个变量,这个变量一般是一个和计算位数相同的无符号型整数。所以如果你只分配一个字节也会带个计数器,其实是对内存的变相的浪费。
2、延迟引用计数器算法
延迟引用其实就是把计数器的引用范围扩大,这样就减少了计数的范围,降低了频次。但这样也会引用一些对象引用值的不准确,所以需要其它一些手段来处理具体的对象。它的原理其实就是将内存对象管理的颗粒度放大并增加适当的辅助机制来确定计数实际值。
3、引入部分标记删除的计数器算法
其实就是为了解决前面提到的循环引用问题,但如果全面引入,则可能反而适得其反,所以只针对可能会产生循环引用的对象引入这个算法。各得其所。
4、Sticky 引用计数法
这种算法其实就是解决上面提到的小内存大计数器以及引用量过多时的处理的办法。一般来说,引用过多的可以忽略不计,当然,也可以引入标记删除等其它方式进行辅助处理。

四、总结

搞过C/C++的小伙伴一般对智能指针都有所了解,其实智能指针用的就是引用计数器的这种算法。正如前面所讲,一个GC未必是只用一个算法,多个或者分不同场景配置不同的算法也是有可能的。没有最好,只有更合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值