2013-05-06 73 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應該回收你所佔用的內存。如果將數組的長度設置爲零,則不必將數組項設置爲空。

相關問題