fat-cat

GarbageCollection 垃圾收集

垃圾收集器会按照固定的时间间隔(或代码执行汇总预定的收集时间),周期性地执行找出那些不再继续使用的变量,然后释放其占用的内存

引用计数

引用计数算法定义「内存不再使」的标准很简单,就是看一个对象是否有指向它的引用。 如果没有其他对象指向它了,说明该对象已经不再需要了

标记清除(mark-and-sweep)

将“不再使用的对象”定义为“无法达到的对象”。 简单来说,就是从根部(在 JS 中就是全局对象)出发定时扫描内存中的对象。 凡是能从根部到达的对象,都是还需要使用的。 那些无法由根部出发触及到的对象被标记为不再使用,稍后进行回收。

工作流程

// 引用计数下,循环引用, 内存泄漏
// 标记清除下,函数调用返回之后,两个循环引用的对象在垃圾收集时从全局对象出发无法再获取他们的引用,会被垃圾收集器回收
function f(){
  var o = {};
  var o2 = {};
  o.a = o2; // o 引用 o2
  o2.a = o; // o2 引用 o  这里

  return "hello word";
}

f();

V8