11

Node.js プロジェクトでメモリ リークが発生しています。クロージャで変数を null に設定しています。つまり、次のようなコードを知っています。

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 },

そして、どのクロージャーがリークしているかについて、より具体的な詳細を取得できるかどうか疑問に思っています。

すべてのクロージャーに名前を割り当てましたが、まだ機能しません。

4

1 に答える 1

2

どの閉鎖についてより具体的に知ることはできません。memwatch は v8 ヒープのダンプを取得し、その差分を取り、ガベージ コレクション イベントが 5 回連続して発生した後、そのオブジェクト タイプの数が増加し続けた場合にリークを報告します。

また、閉鎖とは何かについて混乱していると思います。クロージャーに関する MDN ページは、適切な説明を提供します。クロージャーは変数ではありませんが、関数が参照を保持し、他の方法では変数参照が利用できないコードの一部で使用されたときに機能し続けることを可能にするスコープです。

関数を渡してその関数への参照を保持すると、そのクロージャーは他のクロージャーを参照する可能性があります。そのため、多くのものが含まれる可能性のある単一のクロージャーがある可能性があります。

これを行います: memwatch が文句を言わなくなるまで、コードの一部を無効にします。次に、そのコードを見てください。それでも混乱する場合は、この質問に詳細を投稿してください。

于 2013-06-30T00:41:26.853 に答える