什么是垃圾
没有被引用的,不再需要的内存(变量)就是垃圾
什么是垃圾回收机制 JS 的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。
变量的生命周期 当一个变量的生命周期结束之后它所指向的内存就应该被释放。JS 有两种变量,全局变量和在函数中产生的局部变量。局部变量的生命周期在函数执行过后就结束了,此时便可将它引用的内存释放(即垃圾回收),但全局变量生命周期会持续到浏览器关闭页面。(特殊:全局变量不是垃圾,因为随时可能会被用到。Window 对象肯定不是垃圾)
如何捡垃圾(遍历和计数,只是不同的算法而已)(原理及方法)
- 标记清除算法
- 从全局作用域开始,往下找,把所有遇到的有引用的对象都做一个标记,一直标记到底,然后把没有标记的对象全删掉。
- 该算法的三个改进:
- Generational collection 分代回收,新一代:临时的函数,马上标记马上删,老一代:多存一会儿,过段时间看一下。
- Incremental collection 分批删,比如 10000 个垃圾,一次删 1000 个,删 10 次
- Idle-time collection JS 空闲的时候再去执行
- 引用计数算法 搞个计数器,统计对象被引用的次数,每次发现对象被引用了,就给它次数+1,删除引用就-1,为 0 的时候就可以回收。
- 标记清除算法
前端又有其特殊性(JS 进程和 DOM 进程)