Wie fordere ich den Garbage Collector in node.js zum Ausführen an?

75

Beim Start scheint meine node.js-App etwa 200 MB Speicher zu verwenden. Wenn ich es für eine Weile in Ruhe lasse, schrumpft es auf ungefähr 9 MB.

Ist es möglich aus der App heraus:

  1. Überprüfen Sie, wie viel Speicher die App verwendet?
  2. Fordern Sie den Garbage Collector zum Ausführen an?

Der Grund, den ich frage, ist, dass ich eine Reihe von Dateien von der Festplatte lade, die vorübergehend verarbeitet werden. Dies führt wahrscheinlich zu einem Anstieg der Speichernutzung. Ich möchte jedoch erst dann weitere Dateien laden, wenn der GC ausgeführt wird. Andernfalls besteht das Risiko, dass mir der Speicher ausgeht.

Irgendwelche Vorschläge ?

Rahul Iyer
quelle
Wie laden Sie diese Dateien? Wenn Sie eine große Datei laden müssen, müssen Sie den Stream-Ansatz verwenden und können die Datei verarbeiten, während Sie noch lesen. Hast du darüber nachgedacht?
gut
@well Das war vor 3 Jahren. Ich arbeite gerade an einem anderen Projekt und kann mich nicht an viel erinnern.
Rahul Iyer

Antworten:

117

Wenn Sie den Knotenprozess mit dem --expose-gcFlag starten , können Sie aufrufen global.gc(), um den Knoten zum Ausführen der Speicherbereinigung zu zwingen. Beachten Sie, dass alle anderen Ausführungen in Ihrer Knoten-App angehalten werden, bis der GC abgeschlossen ist. Verwenden Sie sie daher nicht zu oft, da dies die Leistung beeinträchtigt.

Möglicherweise möchten Sie eine Überprüfung einschließen, wenn Sie GC-Aufrufe aus Ihrem Code heraus ausführen, damit nichts schief geht, wenn der Knoten ohne das Flag ausgeführt wurde:

try {
  if (global.gc) {global.gc();}
} catch (e) {
  console.log("`node --expose-gc index.js`");
  process.exit();
}
IgnisFatuus
quelle
1
Wo sind die Dokumente für "--expose-gc"? Ich finde keine Dokumente in nodejs.org.
Pea3nut
1
@ pea3nut ist eine Option der V8-Laufzeit, die der Knoten verwendet. Diese und andere Optionen können mitnode --v8-options
janispritzkau
3
Sie müssen der Funktion für die vollständige GC
treu bleiben,
@PiyushBalapure, haben Sie einen Verweis auf gc () Argumente?
Franck Freiburger
Ich muss noch die Dokumentation für die Argumente gc () sehen. Ich habe es nicht einmal in V8-Dokumenten gefunden. Ich habe hier über die vollständige GC gelesen. Nodesource.com/blog/…
Piyush Balapure
8

Mit Node können wir die Garbage Collection manuell auslösen. Dies kann erreicht werden, indem Node mit --expose-gcFlag (dh node --expose-gc index.js) ausgeführt wird.
Sobald der Knoten in diesem Modus ausgeführt wird, können Sie jederzeit programmgesteuert eine Garbage Collection auslösen, indem Sie global.gc()von Ihrem Programm aus aufrufen .

Ex -

// Force garbage collection every time this function is called
try {
  if (global.gc) {global.gc();}
} catch (e) {
  console.log("`node --expose-gc index.js`");
  process.exit();
}
Piqué
quelle
-6

Eine Sache, die ich vorschlagen würde, ist, dass Sie versuchen, diese Dateien nur dann zu laden, wenn Sie sie benötigen, es sei denn, Sie benötigen sie direkt beim Start.

BEARBEITEN: Siehe den obigen Beitrag.

lwang135
quelle
Ich brauche die Dateien beim Start. Und tatsächlich verwendet meine App nach dem Ausführen des GC nur 9 MB Speicher für die Lebensdauer ihres Bestehens. Ich benötige lediglich ein JSON-Objekt (dh ein Wörterbuch). Da dieser Code in node.js intern ist, kann ich ihn nicht optimieren. Aber ich brauche das Wörterbuch, um für Suchvorschläge verfügbar zu sein.
Rahul Iyer
Ich bin ein bisschen verwirrt. Wie geht es von almost no memorybis auf 9 MB, wenn Sie dieses Objekt für Suchvorschläge benötigen? Ich
gehe
Was meinst du mit fast keiner Erinnerung? Ja, ich "benötige" die json-Datei, die so etwas wie var foo = require ('./ mydictionary') ausführt, und sie existiert für die Lebensdauer meiner App. Beim Start beträgt die Speichernutzung meiner node.js-App bis zu 200 MB! (Ich verstehe nicht, warum Sie fast keinen Speicher sagen) und geht dann nach einiger Zeit auf 9 MB zurück, obwohl sich das Wörterbuch noch im Speicher befindet.
Rahul Iyer
Es tut mir leid, dass ich "fast keinen Speicher" gesagt habe, weil Sie gesagt haben "Aber ich möchte keine weiteren Dateien laden, bis der GC ausgeführt wird, da sonst das Risiko besteht, dass mir der Speicher ausgeht." Vielleicht ist es das Richtige, zu suchen, was Ihre App auf 200 MB bringt. Wenn sich das Wörterbuch im Speicher befindet, sollte dies nicht die Ursache dafür sein.
lwang135
Es ist nur eine erfordernde Anweisung erforderlich ('./ foo'). JSON-Objekt mit Listen von Zeichenfolgen. Mein Server hat nur 1 GB Speicher, also gehe ich nur auf Nummer sicher.
Rahul Iyer