Antworten:
Node-Memwatch : Erkennen und Auffinden von Speicherlecks im Node.JS-Code. Überprüfen Sie dieses Tutorial, um Speicherlecks in Node.js aufzuspüren
Das integrierte Prozessmodul verfügt über eine Methode memoryUsage
, die Einblick in die Speichernutzung des aktuellen Node.js-Prozesses bietet. Hier ist ein Beispiel aus Node v0.12.2 auf einem 64-Bit-System:
$ 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 }
In diesem einfachen Beispiel sehen Sie, dass das Zuweisen eines Arrays von 10 Millionen Elementen ungefähr 80 MB kostet (siehe heapUsed
).
Wenn Sie bei V8 Quellcode aussehen ( Array::New
, Heap::AllocateRawFixedArray
, FixedArray::SizeFor
), dann sehen Sie, dass die von einem Array verwendeten Speicher ist ein fester Wert plus der von der Größe eines Zeigers multipliziert Länge. Letzteres beträgt 8 Bytes auf einem 64-Bit-System, was bestätigt, dass eine beobachtete Speicherdifferenz von 8 x 10 = 80 MB sinnvoll ist.
--expose-gc
für die gc
Funktion nicht benötigt ?
--expose-gc
für brauchen process.memoryUsage()
. gc()
(erforderlich --expose-gc
) wurde in der Antwort verwendet, um die Speicherbereinigung deterministisch auszulösen, damit die process.memoryUsage
Berichte leichter angezeigt werden können.
Wenn Sie den globalen Speicher und nicht den Knotenprozess kennen möchten:
var os = require('os');
os.freemem();
os.totalmem();
Die ursprüngliche Memwatch ist im Wesentlichen tot. Versuchen Sie stattdessen memwatch-next , das auf modernen Node-Versionen gut zu funktionieren scheint.
Verwenden Sie unter Linux / Unix (Hinweis: Mac OS ist ein Unix) top
und drücken Sie M ( Shift+ M), um Prozesse nach Speichernutzung zu sortieren.
Verwenden Sie unter Windows den Task-Manager.
Applications > Utilities
und Sie finden eine Activity Monitor
App. Dieser entspricht dem Task-Manager. OS X hat auch den top
Befehl.
htop
anstelle von Top unter Linux. Es ist viel besser.