回答:
node-memwatch:Node.JSコードのメモリリークを検出して見つけます。このチュートリアルをチェックして、Node.jsでメモリリークを追跡する
組み込みのプロセスモジュールにはmemoryUsage
、現在のNode.jsプロセスのメモリ使用量に関する洞察を提供するメソッドがあります。以下は、64ビットシステムのノードv0.12.2の例です。
$ node --expose-gc
> process.memoryUsage(); // Initial usage
{ rss: 19853312, heapTotal: 9751808, heapUsed: 4535648 }
> gc(); // Force a GC for the baseline.
undefined
> process.memoryUsage(); // Baseline memory usage.
{ rss: 22269952, heapTotal: 11803648, heapUsed: 4530208 }
> var a = new Array(1e7); // Allocate memory for 10m items in an array
undefined
> process.memoryUsage(); // Memory after allocating so many items
{ rss: 102535168, heapTotal: 91823104, heapUsed: 85246576 }
> a = null; // Allow the array to be garbage-collected
null
> gc(); // Force GC (requires node --expose-gc)
undefined
> process.memoryUsage(); // Memory usage after GC
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4528072 }
> process.memoryUsage(); // Memory usage after idling
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4753376 }
この単純な例では、約80MBの10M要素のコンシューマーの配列を割り当てることがわかります(を見てくださいheapUsed
)。
あなたはV8のソースコードを見てみると(Array::New
、Heap::AllocateRawFixedArray
、FixedArray::SizeFor
)、あなたは、アレイで使用されるメモリは、ポインタのサイズを掛けた固定値を加えた長さがあることがわかります。後者は64ビットシステムでは8バイトであり、8 x 10 = 80MBのメモリの違いが観察されることは理にかなっています。
--expose-gc
ためgc
の機能?
--expose-gc
ためprocess.memoryUsage()
。回答でgc()
(必須--expose-gc
)を使用して、ガベージコレクションを確定的にトリガーし、process.memoryUsage
レポートの内容を簡単に確認できるようにしました。
元のmemwatchは本質的に死んでいます。代わりにmemwatch-nextを試してください。これは、最新バージョンのNodeでうまく機能しているようです。
Linux / Unix(注:Mac OSはUnix)でを使用しtop
、M(Shift+ M)を押して、メモリ使用量でプロセスをソートします。
Windowsでは、タスクマネージャを使用します。
Applications > Utilities
と、Activity Monitor
アプリが見つかります。これはタスクマネージャに相当します。OS Xにもtop
コマンドがあります。
htop
Linuxではtopの代わりに使用します。それははるかに優れています。