垃圾回收的五种算法——引用计数法
1.引用计数法
1.1简介
引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、
内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其
释放的过程。使用引用计数技术可以实现自动资源管理的目的。同时引用计数
还可以指使用引用计数技术回收未使用资源的垃圾回收算法。
1.2运行过程(图解)
引用计数法的基本工作原理,即被引用时计数器会+1,取消引用时计数器会-1,当计数器归零时,系统会默认这个变量为无效对象,会进行回收
1.3优点
1)可即刻回收垃圾,每个对象都知道自己的被引用数ref_count,当ref_count为0时,对象就会把自己作为空闲空间连接到空闲链表,也就是,在对象变成垃圾的同时就会被回收,而其它的GC算法只有当分块用尽GC开始执行时,才会知道哪个是垃圾,也就是GC之前会有一部分内存被垃圾占用
2)最大暂停时间短,每次通过指向mutator生成垃圾时,这部分垃圾都会被回收,大幅削减了mutator的最大暂停时间
3)没必要沿指针查找,当我们需要减少沿指针查找的次数是,它就派上用场了
1.4缺点
1)计数器的值增减处理繁重每次指针更新时,计数器的值会被更新,所以在频繁更新指针的mutator中,值的增减处理会变得繁重
2)计数器要占很多位,假如32位的机器,就有可能2的32次方个对象同时引用一个对象,所以必须确保各对象的计数器有32位大小,也就是对于所有的对象,必须留有32位的空间,使内存使用大大降低
3)实现复杂,算法本身简单,但实现复杂,比方说,需要把以往写成*ptr = obj 的地方都要重新写成 update_ptr(ptr,obj)因为调用update_ptr的地方很多,重写过程极易出错
4)循环引用无法回收,就是两个对象相互引用的情况 比如两个对象是同一个类的实例,属性相互赋值(最大缺陷)
######1.5循环引用(图解)