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.