2013-05-06 81 views
0

以下是非常大的逻辑的一部分,功能轨道仅仅是为了简化。跟踪从数据库加载对象并存储在缓存中。以下代码是否会导致JavaScript中的内存泄漏?

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的所有实例,因为没有任何body引用b了?

+0

不是downvoter,但我只能假设你正在得到downvotes,因为你还没有表明,如果你甚至已经测试了代码,或不知道它是否会导致内存泄漏。你有效地说,“这是一些代码,为我测试。” – LittleBobbyTables 2013-05-06 12:25:41

+0

那么没有办法来测试这个,我已经创建了1000个对象,但对象几乎没有任何大小可以看到Chrome的内存管理中的任何明显差异。 – 2013-05-06 12:26:50

回答

3

当一个变量超出范围,它会被垃圾收集。我们删除cache,你有三种方式:

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

对于最后一个,cache.length = 0;我注意到效果所需的一个。它导致delete cache[i]类型的n delete operations。当delete操作发生时,cache[i]中保存的值被取消引用,超出范围,并且垃圾收集器开始工作。

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

更新

根据@Renan上述作品一样好Internet Explorer中,所以cache.length = 0肯定是要走的路。

+0

它在IE 9+中也能正常工作。我不喜欢任何和所有使用旧版本的用户(它已经在10个FFS中),但我有一个预感,它也可以在IE8中工作。 – Renan 2013-05-06 12:31:05

2

如果你只是在做这些,Javascript应该回收你所占用的内存。如果将数组的长度设置为零,则不必将数组项设置为空。

相关问题