一. 垃圾回收的概述
JS中的垃圾回收机制, 负责管理代码执行过程中使用的内存,垃圾回收机制会间歇的不定期的找到那些不在使用的变量 , 然后释放他们所指向的内存
垃圾回收机制是为了避免内存泄漏 ,内存泄漏的含义就是当已经不需要某块内存时 , 这块内存还存在着
二. 两种常见的垃圾回收方式
1. 标记清除法
工作原理 :
当变量进入环境时,例如在函数中声明了一个变量 , 就将这个变量标记为'进入环境',当变量离开环境时 , 就将其标记为'离开环境'
工作流程:
垃圾回收器在运行的时候会给在存储在内存总的所有变量都加上标记
找到环境中的变量以及被环境中的变量引用的变量,然后去掉他们的标记
去掉以上剩下的被加上标记的会被视为准备删除的变量
垃圾回收器完成内存清除工作, 销毁那些带着标记的值 , 并且回收他们占用的内存
使用:
当目前为止 , IE,Firefox,Opera,Chrome,Safari的JS实现使用的都是标记清除的垃圾回收策略或者类似的策略 , 只不过垃圾收集的时间间隔互不相同
2.引用计数法
工作原理:
引用计数是追踪记录每个值被引用的次数 , 当声明了一个变量并将一个引用类型赋值给该变量的时候,这个值得引用次数就加1,当这个引用次数变为0的时候,说明没有变量在使用这个值, 那么就认为可以把它占用的内存回收。
带来的问题:
引用计数方法可能导致循环引用 , 类似于死锁 ,会导致内存泄漏 , 所有用的浏览器比较少
三. 减少垃圾回收的开销
- 在对象结束使用后 , 让obj = null , 这样有利于解除循环引用, 使无用对象及时被回收
- 慎用闭包。闭包容易引起内存泄漏