0

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

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 的引用而导致内存泄漏?为澄清起见,tracker t 不存储对创建的任何对象的任何引用。

我需要以下方法吗?

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

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

4

2 回答 2

3

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

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

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

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

更新

根据@Renan 的说法,上述方法在 Internet Explorer 中同样有效,所以cache.length = 0绝对是要走的路。

于 2013-05-06T12:26:01.190 回答
2

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

于 2013-05-06T12:25:53.487 回答