# 垃圾回收机制

垃圾回收(GC),周期性运行以释放那些不需要的内存.

  • 标记清除法
  • 引用计数法

# 引用计数法

消除依赖的引用,可以被回收。但是如果出现对象之间循环依赖,引用计数法是无效的。

let obj = {
    a:1
}
//test引用了obj
let test = obj;
obj.a  = null;//obj不会被回收,因为obj被test引用
obj = null;///obj不会被回收,因为obj被test引用
test = null;//清除引用,obj被回收

obj1,obj2它们之间还存在着相互引用,并不会被回收。这就造成了内存泄漏。
function f(){
  let obj1 = {}
  let obj2 = {}
  obj1.a = obj2
  obj2.a = obj1
}();

# 标记清除法

标记清除法假定存在一个根对象(相当于js的全局对象),垃圾回收器将定期从根对象开始查找,凡是从根部出发能扫描到的都会保留,扫描不到的将被回收。

  • 垃圾收集器找到所有的根,并“标记”(记住)它们。
  • 然后它遍历并“标记”来自它们的所有引用。
  • 然后它遍历标记的对象并标记 它们的 引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象。
  • ……如此操作,直到所有可达的(从根部)引用都被访问到。
  • 没有被标记的对象都会被删除。