GC 垃圾回收
简单概念
GC
即 Garbage 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 元素的引用、定时器