「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战」
前言
上一章我们讲到了引用计数算法的原理,正所谓人无完人,算法也是如此没有算法是百分之百完美的,有优有劣,本章让我们看一下这个方法的优缺点吧!
引用计数算法的优点
-
发现垃圾时立即回收
引用计数算法就是为每个对象去维护一个引用计数值来统计它被多少对象所使用
- 每当有一个新的引用指向该对象时,引用计数器就+1
- 每当指向该引用对象失效时该计数器就-1
当引用数量为0的时候,则说明对象没有被任何引用指向,可以认定是垃圾对象,那就立刻执行GC算法回收垃圾
-
最大限度减少程序暂停
我们的应用程序在执行的过程中必然会产生内存上的消耗,他的内存肯定是有上限的,垃圾肯定是会不断添加从而导致内存被占满的,而我们的引用计数算法是会监那些占用内存的对象的引用,一旦为0立刻回收,这样就保障我们的内存占满的情况。
引用计数算法的缺点
-
时间开销大
我们当前的引用计数需要去维护一个对象的引用计数,这就意味着我们需要实时的监听一个对象的引用数值是否需要修改,本身来说,一个对象的引用计数修改就需要时间,程序中如果是由更多的对象需要修改,那时间就需要的更大,所以相对于其他的GC算法来说时间的开销就更大一些。
-
无法回收循环引用的对象 这里用函数来演示一下:
function fn() {
const obj = {}
const obj2 = {}
obj.name = obj2
obj2.name = obj.name
return 'EDG 牛逼'
}
fn()
当fn
函数执行完毕之后,就会有垃圾回收的情况,就比如说obj
和obj2
,这里它们的引用计算本来应该为0的,但是有一些问题:
当我们要对 obj
进行垃圾回收的动作的时候,GC会告诉我们 obj1
下面的name
属性是指向obj
的,本来在全局环境中,我们已经无法访问这两个常量了,但是在这里她们有互相指引的关系,引用计数器一直是大于0的,就无法进行垃圾回收,这样就会造成内存的浪费,这也是引用计数算法的一个很致命的缺点
总结
引用计数算法的优点
- 发现垃圾时立即回收
- 最大限度减少程序暂停 引用计数算法的缺点
- 时间开销大
- 无法回收循环引用的对象