Wofür stehen die Rückgabewerte von node.js process.memoryUsage ()?


132

Aus der offiziellen Dokumentation ( Quelle ):

process.memoryUsage ()

Gibt ein Objekt zurück, das die Speichernutzung des Knotenprozesses beschreibt, gemessen in Bytes.

var util = require('util');

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

Dies erzeugt:

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

heapTotal und heapUsed beziehen sich auf die Speichernutzung von V8.

Genau das, was rss , heapTotal und heapUsed stehen?

Es mag wie eine triviale Frage erscheinen, aber ich habe gesucht und konnte bisher keine klare Antwort finden.

Antworten:


156

Um diese Frage zu beantworten, muss man zuerst das Speicherschema von V8 verstehen.

Ein laufendes Programm wird immer durch einen im Speicher zugewiesenen Speicherplatz dargestellt. Dieser Raum heißt Resident Set . V8 verwendet ein ähnliches Schema wie die Java Virtual Machine und unterteilt den Speicher in Segmente:

  • Code : Der tatsächlich ausgeführte Code
  • Stapel : Enthält alle Werttypen (Grundelemente wie Ganzzahl oder Boolescher Wert) mit Zeigern, die auf Objekte auf dem Heap verweisen, und Zeigern, die den Steuerungsfluss des Programms definieren
  • Heap : Ein Speichersegment zum Speichern von Referenztypen wie Objekten, Zeichenfolgen und Abschlüssen. Geben Sie hier die Bildbeschreibung ein

Jetzt ist es einfach, die Frage zu beantworten:

  • rss : Resident Set Size
  • heapTotal : Gesamtgröße des Heaps
  • heapUsed : Heap wird tatsächlich verwendet

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


41
Ein Bild kann 1000 Wörter wert sein.
Bmacnaughton

8
@bmacnaughton Dieser ist im Wert von 1.013 Worte :)
alex

2
[rss, heapTotal, heapUsed] => Größe in Megabyte? Kilobyte? Kannst du das zu deiner Antwort hinzufügen? sind sie alle die gleichen Einheiten?
Alexander Mills

Wie wird heapTotal vom Knoten verwaltet? In meiner App sehe ich, dass heapTotal stetig steigt (unabhängig von GC), obwohl heapUsed begrenzt bleibt. Ich habe keine Erklärung dafür gesehen, wie heapTotal vom Knoten verwaltet wird ... Ich denke, es ist nur ein reservierter Heap für zukünftige Zuweisungen, aber wird irgendetwas davon jemals veröffentlicht (wenn es nicht verwendet wird)? Was würde dazu führen, dass es hoch bleibt?
Logidelic

1
Es gibt eine neue Eigenschaft "external" auf process.memoryUsage (), jeder weiß davon

39

RSS ist die residente Satzgröße , der Teil des Arbeitsspeichers des Prozesses, der im RAM gespeichert ist (im Gegensatz zum Auslagerungsbereich oder dem Teil, der im Dateisystem gespeichert ist).

Der Heap ist der Teil des Speichers, aus dem neu zugewiesene Objekte stammen (denken Sie mallocan C oder newJavaScript).

Sie können mehr über den Haufen bei Wikipedia lesen .


4
Ich denke nicht, dass es die gesamte Erinnerung ist. Auf meinem Computer beträgt der Gesamtspeicher 8 GB, aber wenn ich einen einfachen Knotenprozess ausführe, zeigt RSS ungefähr 13 MB an. Ich denke, es zeigt wirklich, wie viel Speicher durch diesen Prozess im RAM gehalten wird.
Stefan

1
@Stefan richtig, ich bin damals auf einen Fehler gestoßen, aber RSS scheint mir jetzt zuverlässig zu sein.
Mahn

4
Was ist der Unterschied zwischen heapTotalund heapUsed?
Tiblu

3
@tiblu heapTotalist der gesamte von der zugrunde liegenden V8-Engine zugewiesene Heap-Speicherplatz für dynamische Zuweisungen. heapUsedist der Speicher, der in diesem gesamten Raum verwendet wird. Beide werden von V8 verwaltet und können bei Bedarf vergrößert / verkleinert werden.
Elyas-bhy

4
Ein Bild, das die verschiedenen Speicherbereiche visualisiert: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy

7

Die Node.js-Dokumentation beschreibt es wie folgt:

heapTotal und heapUsed beziehen sich auf die Speichernutzung von V8. external bezieht sich auf die Speichernutzung von C ++ - Objekten, die an von V8 verwaltete JavaScript-Objekte gebunden sind. rss, Resident Set Size , ist die Menge an Speicherplatz, die im Hauptspeichergerät ( dh einer Teilmenge des insgesamt zugewiesenen Speichers) für den Prozess belegt ist, einschließlich Heap, Codesegment und Stapel.

Alle genannten Werte werden in Bytes ausgedrückt. Wenn Sie sie also nur drucken möchten, möchten Sie sie wahrscheinlich auf MB skalieren:

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

Das gibt Ihnen eine Ausgabe wie:

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

0

Machen wir das mit einem Beispiel

Das folgende Beispiel zeigt Ihnen, wie die Zunahme der Speichernutzung das rssund tatsächlich erhöhtheapTotal

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') )
    } 
}

Ausführen Das Obige gibt Ihnen ungefähr Folgendes:

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

Dies zeigt Ihnen deutlich, wie durch die Verwendung einer Variablen und die kontinuierliche Erhöhung des dafür benötigten Speicherplatzes die heapTotal und entsprechend die Resident Set Size ( rss) erhöht werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.