1 JavaScript 中的垃圾回收机制(GC)
1.1 垃圾回收相关概念
① 什么是垃圾
没有被使用(引用)的对象就是垃圾。
② 什么是垃圾回收
没有被引用的对象被销毁,内存被释放,就是垃圾回收。
C、C++ 等编程语言需要手动垃圾回收。
Java、JavaScript、PHP、Python 等变成语言自动垃圾回收。
③ 变量的生命周期(何时会被回收)
全局变量: 整个脚本执行完毕,全局变量就被销毁。
局部变量: 函数调用完毕,局部变量就被销毁。
④ 垃圾没有及时回收的后果
没有被及时回收的垃圾会常驻内存,造成内存泄漏。
⑤ 垃圾回收的常见算法
- 引用计数
- 标记清除
1.2 引用计数
① 原理
- ① 每个对象都有一个引用标记,记录引用次数
- ② 如果对对象进行引用,引用标记+1
- ③ 如果取消了对对象的引用,引用标记-1
- ④ 当对象的引用标记次数为 0,就变为垃圾对象,会立即被清除。
② 优缺点:
- 优点: 垃圾对象比清除地非常及时
- 缺点: 如果两个对象互相引用,会造成两个对象常驻内存,造成内存泄漏
1.3 标记清除
① 原理
浏览器会不停地进行垃圾回收的循环,每次循环经历两个阶段:
- 标记阶段:
从根对象开始,一层一层向下找,对所有的能找到的对象进行标记,有标记的对象成为可到达对象,没有标记的对象就是不 可到达对象,也就是垃圾对象。
- 清除阶段
线性变量内存中所有的对象,如果对象没有标记就作为垃圾被清除。
清除完垃圾之后,去掉所有对象的标记,继续进行下一轮的标记清除。
② 优缺点
- 优点:不会造成内存泄漏
- 缺点:需要进行深度递归遍历,垃圾回收不如引用计数方式更及时。