node.js process.memoryUsage()の戻り値は何を表していますか?


132

公式ドキュメントから(ソース):

process.memoryUsage()

ノードプロセスのメモリ使用量をバイト単位で表すオブジェクトを返します。

var util = require('util');

console.log(util.inspect(process.memoryUsage()));

これは以下を生成します:

{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }

heapTotalおよびheapUsedは、V8のメモリ使用量を示します。

rssheapTotal、およびheapUsedは正確には何を表していますか?

些細な質問のように思えるかもしれませんが、これまで探していたため、明確な答えを見つけることができませんでした。

回答:


156

この質問に答えるには、まずV8のメモリスキームを理解する必要があります。

実行中のプログラムは、常にメモリ内に割り当てられたスペースを通じて表されます。この空間は常駐セットと呼ばれます。V8は、Java仮想マシンと同様のスキームを使用して、メモリをセグメントに分割します。

  • コード:実行されている実際のコード
  • スタック:ヒープ上のオブジェクトを参照するポインターとプログラムの制御フローを定義するポインターを持つすべての値の型(整数やブールなどのプリミティブ)を含みます
  • ヒープ:オブジェクト、文字列、クロージャなどの参照型の格納専用のメモリセグメント。 ここに画像の説明を入力してください

これで質問に答えるのは簡単です:

  • rss:常駐セットサイズ
  • heapTotal:ヒープの合計サイズ
  • heapUsed:実際に使用されているヒープ

参照http : //apmblog.dynatrace.com/2015/11/04/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/


41
写真は1000語の価値があります。
bmacnaughton

8
@bmacnaughtonこれは1013語の価値があります:)
alex

2
[rss、heapTotal、heapUsed] =>メガバイト単位のサイズ?キロバイト?それを答えに追加できますか?それらはすべて同じユニットですか?
Alexander Mills

heapTotalはノードによってどのように管理されますか?私のアプリでは、heapUsedが制限されたままであっても、heapTotalが(GCに関係なく)着実に増加しているのがわかります。heapTotalがノードによってどのように管理されるかについての説明は見たことがありません...それは単に将来の割り当てのために予約されたヒープだと思いますが、そのいずれかが(使用されていない場合)解放されることはありますか?何がそれを高く保つのですか?
ロジデリック'28

1
process.memoryUsage()に「external」という新しいプロパティがあります。誰でも知っています

39

RSS常駐セットサイズであり、RAMに保持されているプロセスのメモリの一部です(ファイルシステムに保持されているスワップスペースや部分とは対照的です)。

ヒープは、新たに割り当てられたオブジェクトが(考えるから来るそこからメモリの一部であるmallocCで、またはnewJavaScriptで)。

ウィキペディアでヒープの詳細を読むことができます。


4
それは総メモリではないと思います。私のマシンでは合計メモリは8GBですが、単純なノードプロセスを実行するとRSSが約13MBを表示するので、このプロセスによってRAMにどれだけのメモリが保持されているかを実際に示していると思います。
ステファン、

1
@Stefan正解、当時はなんらかのバグに遭遇しましたが、RSSは今では信頼できるようです。
Mahn、2014

4
違いは何だheapTotalとはheapUsed
tiblu 2015年

3
@tiblu heapTotalは、動的割り当てのために、基になるV8エンジンによって割り当てられたヒープスペースの合計です。heapUsedその合計スペース内で使用されるメモリです。どちらもV8によって管理され、必要に応じて拡大/縮小されます。
elyas-bhy 2015

4
さまざまなメモリ空間を視覚化した画像:apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy

7

Node.jsのをdoumentationは、次のように説明します。

heapTotalおよびheapUsedは、V8のメモリ使用量を示します。外部とは、V8が管理するJavaScriptオブジェクトにバインドされたC ++オブジェクトのメモリ使用量を指します。rss、Resident Set Sizeは、ヒープ、コードセグメント、スタックを含む、プロセスのメインメモリデバイス(割り当てられた合計メモリのサブセット)で占有されているスペースの量です。

上記の値はすべてバイト単位で表されます。したがって、単にそれらを印刷したい場合は、おそらくそれらをMBに再スケーリングする必要があります。

const used = process.memoryUsage();
for (let key in used) {
  console.log(`Memory: ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}

次のような出力が得られます。

Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB

0

例でこれをやってみましょう

メモリ使用量の増加が実際に増加する方法を次の例では、あなたが表示されますrssし、heapTotal

const numeral = require('numeral');
let m = new Map();
for (let i = 0; i < 100000; i++) {
    m.set(i, i);
    if (i % 10000 === 0) { 
        const { rss, heapTotal } = process.memoryUsage();
        console.log( 'rss', numeral(rss).format('0.0 ib'), heapTotal, numeral(heapTotal).format('0.0 ib') )
    } 
}

上記を実行すると、次のような結果が得られます。

rss 22.3 MiB 4734976 4.5 MiB
rss 24.2 MiB 6483968 6.2 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 32.8 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB

これは、変数を使用し、それに必要なスペースを連続的にインクリメントして、heapTotalを増やし、それに応じてResident Set Size(rss)を増やす方法を明確に示しています。

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