2012-03-14 38 views
6

jsの問題でメモリリークが発生しました。JavaScriptのメモリリークを防ぐ方法

はJavascriptを:

var index = 0; 
function leak() { 
    console.log(index); 
    index++; 
    setTimeout(leak, 0); 
} 
leak(); 

ここでは、私のテストコードで、私はそれのメモリ使用を検出するためにinstruments.appを使用し、 とメモリが非常に速く上がっています。

メモリを占有する変数がないようです。

なぜですか?

任意の考えがあります。

+0

だからあなたの製品コードは何ですか?多分重要な部分だけかもしれません。問題の原因となるコードを修正することは意味をなさない。 – tungd

+0

生産コードでも同じ問題が発生します。私はちょうどこれらのコードでメモリ使用を解放する方法を把握していません。 –

答えて

10

あなたのコードは一連のクロージャを作成します。これにより、メモリの解放が防止されます。あなたの例では、メモリはすべてのタイムアウトの完了後に解放されます。

これは、(100秒後)見ることができます。

var index = 0; 
var timeout; 
function leak() { 
    index++; 
    timeout = setTimeout(leak, 0); 
} 

leak(); 

setTimeout(function() { 
     clearTimeout(timeout); 
}, 100000); 

setInterval(function() { 
     console.log(process.memoryUsage()); 
}, 2000); 
+0

omg、つまりsettimeoutオブジェクトが原因で問題が発生しました。どうもありがとう。 –

+0

しかし、世界で最悪の言葉では、リークが誘発していないときにクリアタイムアウトイベントが発生した場合、プログラムはシャットダウンするという問題があります。私はちょうどリーク関数でcleartimeoutイベントを入れて、それはシャットダウンされません。 –

関連する問題