Javascript 引用计数法的原理和缺点

1,846 阅读2分钟

引用计数法是什么?

引用计数法是GC算法之一。GC算法是内存管理中,垃圾回收器完成垃圾回收,从查找垃圾、释放空间到回收垃圾的一种规则。

内存管理

开发者主动申请空间、使用空间和释放空间。

申请空间

let obj = {}

使用空间

let obj.name = 'stone'

释放空间

let obj = null

以下就完成了一次内存管理,如果没有空间释放内存就会泄漏。

垃圾回收

Javascript 中的内存管理是自动的,对于一个对象来说如果它不再被引用,或者因为一些不当的逻辑操作以至于不能在根上访问到的时候,它就是垃圾。

(所谓根就是全局变量对象,访问的方式可以是通过引用,又或者是作用域链。)

当发现垃圾的时候,Javascript 执行引擎就会过来把垃圾所占的对象空间回收。

引用计数法的原理

引用计数算法的原理是设置一个引用数,判断当前引用数是否是0。

代码中有一个对象空间,多了一个变量名指向它,引用计数器就为它的引用数 + 1,减b少一个引用引用计数器就为它的引用数 - 1, 一旦引用数变为 0, 该对象空间就会被认为是垃圾,然后被回收。

引用计数算法的优点

  • 发现了垃圾可以立即回收,一旦引用数为 0 就进行回收。
  • 可以避免程序的暂停,因为一旦程序内存将要爆满的时候,引用计数就会找到垃圾并进行回收。

引用计数算法的缺点

  • 无法回收循环引用的对象, 因为在如下代码中,在函数执行结束后,虽然 stone1 和 stone2 都无法被根访问到了,但是由于他们自身互相引用所以根据引用计数法的回收条件,是无法被回收的。
function fn() {
    const stone1 = {}
    const stone2 = {}
    stone1.name = stone2
    stone2.name = stone1
fn()
  • 时间开销大,因为引用计数算法需要维护引用数,一旦发现引用数发生改变需要立即对引用数进行修改。