以下代码是否会导致JavaScript中的内存泄漏?

时间:2013-05-06 12:22:02

标签: javascript memory-leaks

以下是非常大的逻辑的一部分,功能跟踪仅用于简化。跟踪从数据库加载对象并存储在缓存中。

var cache = [];

function newObject(a){
   var b = {};
   b.tracker = a;
   cache.push(b);
}

var t = {};

track(t);
track(t);
track(t);
track(t);

...

cache.length = 0;

track(t);
track(t);
track(t);
track(t);

....
cache.length = 0;

清除缓存后,是否会导致内存泄漏,因为b.tracker持有对t的引用?为了澄清,跟踪器t不存储对任何创建的对象的任何引用。

我需要以下方法吗?

for(var i=0;i<cache.length;i++){
    cache[i].tracker = null;
}
cache.length = 0;

或者JavaScript引擎足够聪明,可以删除b的所有实例,因为没有正文引用b了吗?

2 个答案:

答案 0 :(得分:3)

当变量超出范围时,会收集垃圾。现在要删除cache,您将有三种方法:

delete cache; // which is not possible because it's defined with var.
cache = [];
cache.length = 0;

对于最后一个,cache.length = 0;我注意到效果是理想的效果。它会生成n delete operations类型的delete cache[i]。一旦delete操作发生,cache[i]中保存的值就会被取消引用,超出范围,垃圾收集器就会启动。

所以是的,JavaScript引擎非常聪明,可以做到这一点。我测试了4套分析工具(Chrome,Safari,Firefox和Opera)。我缺乏拥有Windows机器所需的极大耐心,所以我无法在Internet Explorer中进行测试。

<强>更新

根据@Renan的说法,上述内容在Internet Explorer中同样适用,因此cache.length = 0绝对是可行的方法。

答案 1 :(得分:2)

Javascript应该回收你的t占用的内存,如果这就是你正在做的事情。如果要将数组的长度设置为零,则不必将数组项设置为null。