垃圾回收机制

Mr.ZhaoAbout 2 min

1. 什么是垃圾回收机制

垃圾回收机制(Garbage Collection)简称 GC

JavaScript 中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收,如果不再用到的内存没有及时释放,则会产生内存泄漏

2. 内存的生命周期

JavaScript 环境中分配的内存,一般有如下生命周期:

  1. 内存分配:当我们声明变量、函数、对象的时候,系统会自动为它们分配内存
  2. 内存使用:即读写内存,也就是使用变量、函数等
  3. 内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存

说明:

  • 全局变量一般不会回收(关闭页面回收)
  • 一般情况下局部变量的值不用了,会被自动回收掉

3. 垃圾回收算法

3.1 引用计数

定义“内存不再使用”,就是看一个对象是否有指向它的引用,没有引用了就回收对象

算法:

  1. 跟踪记录被引用的次数
  2. 如果被引用了一次,那么就记录次数 1,多次引用会累加
  3. 如果减少一个引用就减一
  4. 如果引用次数是 0,则释放内存

存在问题: 嵌套引用(循环引用),如果两个对象相互引用,尽管他们已不再使用,垃圾回收器不会进行回收,导致内存泄漏

3.2 标记清除法

现代浏览器大多使用该方法

算法:标记清除法将“不再使用的对象”定义为“无法到达的对象”,就是从根部出发定时扫描内存中的对象。凡是能从根部到达的对象,都是还需要使用的,那些无法由根部出发触及到的对象被标记为不再使用,稍后进行回收