介绍
垃圾回收也叫内存回收,JavaScript在创建变量时自动分配内存,在不使用它时进行自动释放,这个过程为“垃圾回收”
内存生命周期
- 创建:声明变量
- 分配:变量赋值
- 回收:删除属性、赋值为null
可达性
JavaScript内存管理概念是可达性,当某个值可访问或被变量引用时,它们一定存储在内存中
垃圾回收算法
算法主要依赖于引用,当内存值不可达时,就会被自动回收
引用计数
语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。
缺点:当两个创建好的对象进行相互引用时,无法回收
function f(){
var o = {};
var o2 = {};
o.a = o2; // o 引用 o2
o2.a = o; // o2 引用 o
return "azerty";
}
f();
引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。
标记-清除
定期执行以下步骤:
- 垃圾收集器找到所有的根,并标记它们
- 然后遍历并标记所有引用
- 接着遍历标记的对象并标记其引用,
- 如此这般,直到所有可达引用都被访问到
- 把没有标记的对象删除
参考
JavaScript.info之垃圾回收 JavaScript深入之带你走进内存机制 MDN 内存管理 JavaScript 内存泄漏教程