この質問は、似たようなことについて尋ねます。基本的には、コールバックでクロージャーを使用する場合、終了時にコールバックを「サブスクライブ」して、GC が再度呼び出すことができないことを認識できるようにする必要があります。これは私には理にかなっています。呼び出されるのを待っているだけのクロージャがある場合、GC はそれが終了したことを認識するのに苦労します。クロージャをコールバック メカニズムから手動で削除すると、クロージャは参照されなくなり、コレクションに使用できるようになります。
また、Mozilla は、Node.jsコードでのメモリ リークの発見に関する素晴らしい記事を公開しています。彼らの戦略のいくつかを試してみると、リークのある動作を表現するコードの部分を見つけることができると思います. ベスト プラクティスはどれも素晴らしいものですが、プログラムのニーズを理解し、経験的に観察できることに基づいてパーソナライズされたベスト プラクティスを考え出す方が役立つと思います。
以下は、Mozilla の記事からの簡単な抜粋です。
- Jimb Esser の .GCCユーティリティを
node-mtrace
使用してmtrace
ヒープ使用量をプロファイリングします。
- Dave Pacheco
node-heap-dump
は、V8 ヒープのスナップショットを取得し、すべてを巨大な JSON ファイルにシリアル化します。これには、結果のスナップショットを JavaScript でトラバースして調査するためのツールが含まれています。
- Danny Coatesは、V8 プロファイラー用の Node バインディングと、WebKit Web Inspector を使用した Node デバッグ インターフェイスを提供します
v8-profiler
。node-inspector
- Felix Gnass の fork は、retainers グラフを無効にします。
- Felix Geisendörfer の Node Memory Leak Tutorial は、 と の使用方法の簡潔でわかりやすい説明で
v8-profiler
ありnode-debugger
、現在、ほとんどの Node.js メモリ リーク デバッグの最先端です。
- Joyent の SmartOS プラットフォーム。Node.js のメモリ リークをデバッグするためのさまざまなツールを自由に使用できます。
この質問に対する答えは、基本的null
に、クロージャー変数に代入することで GC を助けることができると言っています。
var closureVar = {};
doWork(function callback() {
var data = closureVar.usefulData;
// Do a bunch of work
closureVar = null;
});
関数内で宣言された変数は、他のクロージャーで使用されているものを除いて、関数が戻るときに消えます。この例でclosureVar
は、 が呼び出されるまでメモリ内に存在する必要がありますがcallback()
、それがいつになるかは誰にもわかりません。コールバックが呼び出されたら、クロージャー変数を null に設定することで、GC にヒントを与えることができます。
免責事項: 以下のコメントからわかるように、この情報は古く、Node.js にとって重要ではないと言う SO ユーザーがいます。それについてはまだ決定的な答えがありません。ネットで見つけたものを掲載しています。