# 垃圾回收机制
垃圾回收(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的全局对象),垃圾回收器将定期从根对象开始查找,凡是从根部出发能扫描到的都会保留,扫描不到的将被回收。
- 垃圾收集器找到所有的根,并“标记”(记住)它们。
- 然后它遍历并“标记”来自它们的所有引用。
- 然后它遍历标记的对象并标记 它们的 引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象。
- ……如此操作,直到所有可达的(从根部)引用都被访问到。
- 没有被标记的对象都会被删除。