2012-12-10 10 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が表示されますが、ターゲットを指定するには十分ではありません。

私はこの

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

のようなJSONを持っていると私は、クロージャが漏れているかについて、より具体的な詳細を得ることができる場合、私は疑問に思って。

私はすべてのクロージャの名前を割り当てましたが、まだ動作しません。

+0

これはオブジェクトリテラルです。それ自体は、そのプロパティの1つを文字列 'Closure'に設定することを除いて、「クロージャ」とは何の関係もありません。「1982 Datsun Cherry」である可能性もあります。 –

+0

それで、どんな種類のオブジェクトがそうするのですか?私は自分で "閉鎖"を設定しません。 – bxshi

+0

ええ、私は恥ずかしいです、私はあなたの質問が今であることをよく分かります。私はmemwatchのドキュメントに入っていますが、diffレポートの '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が不平を言うまで、コードの一部を無効にします。次に、そのコードを見てください。あなたがまだ混乱している場合は、この質問に詳細を投稿してください。

関連する問題