2012-12-10 27 views
10

我Node.js的項目遭受內存泄漏,我已經給變量設置爲null在關閉,我的意思是,我知道這樣的代碼:確定關閉的內存泄漏MEMWATCH節點

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
}); 

會引起內存泄漏,所以我添加了一些代碼來將這些變量設置爲null;

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
    a = null; 
    b = null; 
    c = null; 
}); 

但我仍然有泄漏,所以我嘗試使用memwatch-node找出我的代碼有什麼問題。

並且結果顯示closure引起泄漏,但未指定足夠的目標。

我已經得到了JSON這樣

{ what: 'Closure', 
    '+': 12521, 
    size: '520.52 kb', 
    '-': 5118, 
    size_bytes: 533016 }, 

而且我想知道如果我能得到哪些封閉漏水更具體的細節。

我已經爲所有閉包指定了名稱,但仍然無效。

+0

這是一個對象字面值。它本身與「關閉」無關,除了它的一個屬性設置爲字符串「關閉」,這可能是'1982年達森櫻桃'。 –

+0

那麼哪種物體會這樣做呢?我不會自己設定「關閉」。 – bxshi

+0

是的,我很尷尬,我現在可以更好地看到你的問題。我已經進入了memwatch文檔,但在差異報告中找不到「what:'Closure'」部分的證據。 [This](https://hacks.mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season/)表示會報告封閉泄漏,但不是那樣。這有點令人困惑。 –

回答

2

您無法獲得關於哪個關閉的更具體說明。 memwatch獲取v8堆的轉儲,然後獲取它的差異,並在5次連續垃圾回收事件後繼續增加對象類型計數時報告泄漏。

此外,我相信你對什麼封閉是困惑的。 The MDN page on closures給出了很好的描述。閉包不是一個變量,而是一個範圍,它使函數能夠保留引用,並在代碼的一部分中使用時繼續工作,否則這些變量引用將不可用。

如果您傳遞函數以保持對該函數的引用,則閉包可引用其他閉包。所以,有可能你有一個可能會有很多內容的閉包。

執行此操作:禁用部分代碼,直到memwatch停止投訴。然後,看看那個代碼。如果您仍然感到困惑,請在此問題中發佈更多詳細信息。