引用计数法是什么?
引用计数法是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()
- 时间开销大,因为引用计数算法需要维护引用数,一旦发现引用数发生改变需要立即对引用数进行修改。
网友评论