Bagaimana cara memantau penggunaan memori Node.js?


Jawaban:


66

node-memwatch : mendeteksi dan menemukan kebocoran memori dalam kode Node.JS. Periksa tutorial ini Melacak Kebocoran Memori di Node.js


1
node-memwatch tampaknya tidak aktif lagi (terakhir diperbarui pada Maret 2013). Apakah ada alternatif lain?
Golo Roden

6
@GoloRoden npm install memwatch-next berfungsi dengan baik. Ini adalah reponya
fre2ak

Sumber daya yang lebih mutakhir untuk memburu kebocoran memori apmblog.dynatrace.com/2015/11/04/…
saintedlama

22
memwatch tidak dipertahankan lagi dan tidak akan berfungsi pada node versi terbaru jadi jangan repot-repot.
Mike


153

Built-in proses modul memiliki metode memoryUsageyang menawarkan wawasan dalam penggunaan memori dari proses Node.js saat ini. Berikut adalah contoh dari Node v0.12.2 pada sistem 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 }

Dalam contoh sederhana ini, Anda dapat melihat bahwa mengalokasikan array 10 juta elemen konsumen sekitar 80MB (lihatlah heapUsed).
Jika Anda melihat kode sumber V8 ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), maka Anda akan melihat bahwa memori yang digunakan oleh sebuah array adalah nilai tetap ditambah panjang dikalikan dengan ukuran pointer. Yang terakhir adalah 8 byte pada sistem 64-bit, yang menegaskan bahwa perbedaan memori yang diamati sebesar 8 x 10 = 80MB masuk akal.


1
@MestreSan Versi Node mana yang tidak diperlukan --expose-gc untuk gcfungsi?
Rob W

1
@MestreSan Aku tidak pernah mengatakan bahwa Anda perlu --expose-gcuntuk process.memoryUsage(). gc()(membutuhkan --expose-gc) digunakan dalam jawaban untuk secara deterministik memicu pengumpulan sampah agar lebih mudah untuk melihat apa yang process.memoryUsagedilaporkan.
Rob W.

Itu jawaban yang luar biasa untuk mengukur JS-Stuff dengan cara yang benar. Terima kasih atas jawaban itu.
suther

Anda melakukan pekerjaan tuan dengan yang satu ini. Saya baru menyadari semua metode yang diekspos oleh proses panggilan yang akan membantu saya membuat aplikasi yang lebih efisien. Terima kasih.
Andrew

40

Juga, jika Anda ingin mengetahui memori global daripada proses node ':

var os = require('os');

os.freemem();
os.totalmem();

Lihat dokumentasi


1
Namun, freemem () tidak sama dengan memori yang tersedia di server. Adakah cara untuk menemukan memori yang tersedia selain yang gratis?
Alex


5

Di Linux / Unix (catatan: Mac OS adalah Unix) gunakan topdan tekan M ( Shift+M ) untuk mengurutkan proses berdasarkan penggunaan memori.

Di Windows gunakan Task Manager.


@majidarif Pergi ke Applications > Utilitiesdan Anda akan menemukan sebuah Activity Monitoraplikasi. Yang itu setara dengan Task Manager. OS X juga memiliki topperintahnya.
Ingwie Phoenix

3
gunakan htopsebagai ganti top di Linux. Jauh lebih baik.
Ryan Shillington
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.