Node.jsのメモリ使用量を監視するにはどうすればよいですか?


回答:


66

node-memwatch:Node.JSコードのメモリリークを検出して見つけます。このチュートリアルをチェックして、Node.jsでメモリリークを追跡する


1
node-memwatchはもう動作していないようです(最終更新日は2013年3月)。代替案はありますか?
Golo Roden、2015

6
@GoloRoden npm install memwatch-nextは正常に動作します。これがレポです:github.com/marcominetti/node-memwatch
fre2ak

より最新のリソースへのメモリリークを追い詰めるためapmblog.dynatrace.com/2015/11/04/...
saintedlama

22
memwatchはもうメンテナンスされておらず、nodeの最近のバージョンでは動作しないので、気にしないでください。
Mike


153

組み込みのプロセスモジュールには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::NewHeap::AllocateRawFixedArrayFixedArray::SizeFor)、あなたは、アレイで使用されるメモリは、ポインタのサイズを掛けた固定値を加えた長さがあることがわかります。後者は64ビットシステムでは8バイトであり、8 x 10 = 80MBのメモリの違いが観察されることは理にかなっています。


1
@MestreSanノードのバージョンを必要としない--expose-gcためgcの機能?
Rob W

1
@MestreSan私はあなたが必要なことを言ったことがない--expose-gcためprocess.memoryUsage()。回答でgc()(必須--expose-gc)を使用して、ガベージコレクションを確定的にトリガーし、process.memoryUsageレポートの内容を簡単に確認できるようにしました。
Rob W

これはJS-Stuffを正しい方法で測定するための素晴らしい答えです。その答えをありがとう。
suther

あなたは領主たちがこれを使って仕事をしました。プロセスを呼び出すことで公開されるすべてのメソッドに気付いたので、より効率的なアプリケーションを作成できます。ありがとう。
アンドリュー

40

また、ノードプロセスではなくグローバルメモリを知りたい場合は、次のようにします。

var os = require('os');

os.freemem();
os.totalmem();

ドキュメントを見る


1
ただし、freemem()はサーバーで使用可能なメモリとは異なります。空きではなく利用可能なメモリを見つける方法はありますか?
Alex


5

Linux / Unix(注:Mac OSはUnix)でを使用しtop、M(Shift+ M)を押して、メモリ使用量でプロセスをソートします。

Windowsでは、タスクマネージャを使用します。


@majidarifに移動するApplications > Utilitiesと、Activity Monitorアプリが見つかります。これはタスクマネージャに相当します。OS Xにもtopコマンドがあります。
Ingwie Phoenix 2015

3
htopLinuxではtopの代わりに使用します。それははるかに優れています。
Ryan Shillington
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.