浅析垃圾回收

186 阅读1分钟

介绍

垃圾回收也叫内存回收,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 内存泄漏教程