Risposte:
node-memwatch : rileva e trova perdite di memoria nel codice Node.JS. Controlla questo tutorial Tracking Down Memory Leaks in Node.js
Il modulo di processo integrato ha un metodo memoryUsage
che offre informazioni sull'utilizzo della memoria dell'attuale processo Node.js. Ecco un esempio tratto da Node v0.12.2 su un sistema a 64 bit:
$ 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 questo semplice esempio, puoi vedere che l'allocazione di un array di 10 milioni di elementi consuma circa 80 MB (dai un'occhiata heapUsed
).
Se si guarda il codice sorgente di V8 ( Array::New
, Heap::AllocateRawFixedArray
, FixedArray::SizeFor
), allora vedrai che la memoria utilizzata da un array è un valore fisso più la lunghezza moltiplicata per la dimensione di un puntatore. Quest'ultimo è di 8 byte su un sistema a 64 bit, il che conferma che la differenza di memoria osservata di 8 x 10 = 80 MB ha senso.
--expose-gc
della gc
funzione?
--expose-gc
per process.memoryUsage()
. gc()
(require --expose-gc
) è stato utilizzato nella risposta per attivare in modo deterministico la garbage collection per rendere più facile vedere cosa process.memoryUsage
riporta.
Inoltre, se desideri conoscere la memoria globale piuttosto che il processo del nodo ":
var os = require('os');
os.freemem();
os.totalmem();
Il memwatch originale è sostanzialmente morto. Prova invece memwatch-next , che sembra funzionare bene sulle versioni moderne di Node.
Su Linux / Unix (nota: Mac OS è un Unix) usa top
e premi M ( Shift+ M) per ordinare i processi in base all'utilizzo della memoria.
Su Windows usa il Task Manager.
Applications > Utilities
e troverai Activity Monitor
un'app. Quello è l'equivalente di Task Manager. Anche OS X ha il top
comando.
htop
invece di top su Linux. È molto meglio.