JavaScript 中的垃圾回收机制(GC)

1 JavaScript 中的垃圾回收机制(GC)

1.1 垃圾回收相关概念

① 什么是垃圾

没有被使用(引用)的对象就是垃圾。

② 什么是垃圾回收

没有被引用的对象被销毁,内存被释放,就是垃圾回收。

C、C++ 等编程语言需要手动垃圾回收。

Java、JavaScript、PHP、Python 等变成语言自动垃圾回收。

③ 变量的生命周期(何时会被回收)

全局变量: 整个脚本执行完毕,全局变量就被销毁。

局部变量: 函数调用完毕,局部变量就被销毁。

④ 垃圾没有及时回收的后果

没有被及时回收的垃圾会常驻内存,造成内存泄漏。

⑤ 垃圾回收的常见算法

- 引用计数
- 标记清除

1.2 引用计数

① 原理

- ① 每个对象都有一个引用标记,记录引用次数
- ② 如果对对象进行引用,引用标记+1
- ③ 如果取消了对对象的引用,引用标记-1
- ④ 当对象的引用标记次数为 0,就变为垃圾对象,会立即被清除。

② 优缺点:

- 优点: 垃圾对象比清除地非常及时
- 缺点: 如果两个对象互相引用,会造成两个对象常驻内存,造成内存泄漏

1.3 标记清除

① 原理

浏览器会不停地进行垃圾回收的循环,每次循环经历两个阶段:
- 标记阶段:
  从根对象开始,一层一层向下找,对所有的能找到的对象进行标记,有标记的对象成为可到达对象,没有标记的对象就是不   可到达对象,也就是垃圾对象。
- 清除阶段
  线性变量内存中所有的对象,如果对象没有标记就作为垃圾被清除。
  清除完垃圾之后,去掉所有对象的标记,继续进行下一轮的标记清除。

② 优缺点

- 优点:不会造成内存泄漏
- 缺点:需要进行深度递归遍历,垃圾回收不如引用计数方式更及时。
经验分享 程序员 微信小程序 职场和发展