Skip to content
本页目录

GC 垃圾回收

简单概念

GCGarbage Collection,是程序在内存中执行后,未被使用或者不会被再次使用的代码,他们将会被收集起来在特定时间进行销毁,以释放内存。

举个例子:

JS
let a = [1];
a = {'a': 1};
let a = [1];
a = {'a': 1};

在代码执行后,由于 [1] 失去了变量引用,变为无用数据,所以我们需要将其所占用的堆内存空间释放掉,GC 做的就是这个事情,它会每隔一段时间进行扫描,获取无用的对象,进行收集清理。

垃圾回收方式

1. 标记清除法

当前主流 JS 引擎使用的方法,但各家浏览器的实现上有差异(算法与回收频率),其执行过程如下:

  • 将内存中所有的 js 变量假设全部为垃圾,打标记 0;
  • 从根对象(有多个,如window对象、dom对象等)开始遍历,把使用到的变量标记置为1;
  • 清理所有标记为0的变量,销毁回收其内存;
  • 将所有变量标记重置为0,等待下次遍历回收。

优点:

  • 实现简单

缺点:

  • 垃圾回收后,被回收的内存空间不会被整合,形成内存碎片,导致内存利用率降低;
  • 新变量需要从内存碎片中逐个查找满足其内存的空间,导致分配速度变慢;

解决方案:

  • 标记整理算法,在标记结束后,该算法会将标记为1的对象移动到内存的一端,再将标记为1的对象清理掉

2. 引用计数法

内存优化

  • 栈内存: 把上下文中,被外部占用的堆的占用取消
  • 堆内存: fn = null

内存泄漏

常见的内存泄露主要有 4 种,全局变量、闭包、DOM 元素的引用、定时器

问题

1. js 的垃圾回收机制是什么?

2. js 的垃圾是怎么产生的?

3. V8 引擎是如何回收垃圾的?