概念:找出那些不再继续使用的变量,然后释放其占用的内存。他会按照固定的时间间隔,或代码执行中预定的收集时间,周期性的执行这一操作。
标记清除
- 最常用的
当变量进入环境(例如在函数中声明一个变量)时,就将这个变量标记为进入环境。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,可以使用任何方式来标记变量
垃圾收集器在运行时给存储在内存中的所有变量都加上标记。然后去掉环境中的变量以及被环境中变量引用的变量的标记。在此之后,再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾收集器完成内存收集工作。销毁那些带标记的值,并回收他们所占用的内存。
引用计数
跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,这个值的引用次数就是1.如果同一个值又被赋给另一个变量,则该值的引用次数加1.相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值引用次数减1.当这个值得引用次数变为0时,说明没办法再访问这个值了,就将其占用的内存空间回收回来。当垃圾收集器再次运行时,释放那些引用次数为零的值所占用的内存。
限制:循环引用 => 指对象A中包含一个指向对象B的指针,而对象B中也包含了一个指向对象A的引用。
function problem () {
var objA = new Object();
var objB = new Object();
objA.otherObj = objB;
objB.anotherObj = objA;
}
上面例子中,两个对象的引用次数都是2,。若是标记清除,由于函数执行后,两个对象都离开了作用域,因此这样合理。但在计数策略实现中,他们的引用次数永远不会是0.加入这个函数被多次调用,会导致大量内存得不到回收。
解决:在不适用他们时,手动断开引用。
= null;赋值为null.
在IE中
window.CollectGarbage();
会立即执行立即回收机制。
opera中,
window.opera.collect();
网友评论