Apa nilai balik dari node.js process.memoryUsage () berdiri untuk?

132

Dari dokumentasi resmi ( sumber ):

process.memoryUsage ()

Mengembalikan objek yang menggambarkan penggunaan memori dari proses Node yang diukur dalam byte.

var util = require('util');

console.log(util.inspect(process.memoryUsage()));

Ini akan menghasilkan:

{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472 }

heapTotal dan heapUsed merujuk pada penggunaan memori V8.

Apa sebenarnya yang dilakukan oleh rss , heapTotal , dan heaped ?

Ini mungkin tampak seperti pertanyaan sepele, tetapi saya sudah mencari dan saya tidak bisa menemukan jawaban yang jelas sejauh ini.

Mahn
sumber

Jawaban:

156

Untuk menjawab pertanyaan ini, orang harus memahami Skema Memori V8 terlebih dahulu.

Program yang berjalan selalu diwakili melalui beberapa ruang yang dialokasikan dalam memori. Ruang ini disebut Resident Set . V8 menggunakan skema yang mirip dengan Java Virtual Machine dan membagi memori menjadi beberapa segmen:

  • Kode : kode aktual yang dieksekusi
  • Stack : berisi semua tipe nilai (primitif seperti integer atau Boolean) dengan pointer yang merujuk objek pada heap dan pointer yang mendefinisikan aliran kontrol program
  • Heap : segmen memori yang didedikasikan untuk menyimpan tipe referensi seperti objek, string, dan penutup. masukkan deskripsi gambar di sini

Sekarang mudah untuk menjawab pertanyaan:

  • rss : Resident Set Size
  • heapTotal : Ukuran Total Heap
  • heapUsed : Heap sebenarnya Digunakan

Ref : http://apmblog.dynatrace.com/2015/11/11/understanding-garbage-collection-and-hunting-memory-leaks-in-node-js/

timqian
sumber
41
Sebuah gambar bisa bernilai 1000 kata.
bmacnaughton
8
@ bmacnaughton Yang ini bernilai 1013 kata :)
alex
2
[rss, heapTotal, heapUsed] => ukuran dalam megabyte? kilobyte? dapatkah Anda menambahkannya ke jawaban Anda? apakah mereka semua unit yang sama?
Alexander Mills
Bagaimana heapTotal dikelola oleh node? Dalam aplikasi saya, saya melihat heapTotal naik terus (terlepas dari GC) meskipun heapDigunakan tetap dibatasi. Saya belum melihat penjelasan tentang bagaimana heapTotal dikelola oleh node ... Saya kira itu hanya cadangan heap untuk alokasi masa depan, tetapi apakah semua itu pernah dirilis (jika tidak digunakan)? Apa yang menyebabkannya tetap tinggi?
logidelic
1
ada properti "eksternal" baru di process.memoryUsage (), ada yang tahu tentang itu
39

RSS adalah ukuran yang ditetapkan penduduk , bagian dari memori proses yang disimpan dalam RAM (sebagai lawan ruang swap atau bagian yang disimpan dalam sistem file).

The tumpukan adalah bagian dari memori dari mana objek baru dialokasikan akan datang dari (memikirkan mallocdi C, atau newdalam JavaScript).

Anda dapat membaca lebih lanjut tentang tumpukan di Wikipedia .

Ray Toal
sumber
4
Saya tidak berpikir itu adalah total memori. Di mesin saya, total memori adalah 8GB, tetapi ketika saya menjalankan proses simpul sederhana, RSS menunjukkan sekitar 13MB, jadi saya pikir itu benar-benar menunjukkan berapa banyak memori yang disimpan dalam RAM oleh proses ini.
Stefan
1
@Stefan benar, saya menemukan semacam bug saat itu, tetapi RSS tampaknya dapat diandalkan bagi saya sekarang.
Mahn
4
Apa perbedaan antara heapTotaldan heapUsed?
tiblu
3
@tiblu heapTotaladalah total ruang tumpukan yang dialokasikan oleh mesin V8 yang mendasarinya, untuk alokasi dinamis. heapUsedadalah memori yang digunakan dalam ruang total itu. Keduanya dikelola oleh V8, dan dapat tumbuh / menyusut kapan pun diperlukan.
elyas-bhy
4
Gambar yang memvisualisasikan ruang memori yang berbeda: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy
7

The Node.js doumentation menggambarkannya sebagai berikut:

heapTotal dan heapUsed merujuk pada penggunaan memori V8. eksternal mengacu pada penggunaan memori objek C ++ terikat ke objek JavaScript yang dikelola oleh V8. rss, Resident Set Size , adalah jumlah ruang yang digunakan dalam perangkat memori utama (yang merupakan subset dari total memori yang dialokasikan) untuk proses, yang meliputi tumpukan, segmen kode, dan tumpukan.

Semua nilai yang disebutkan dinyatakan dalam byte. Jadi, jika Anda hanya ingin mencetaknya, Anda mungkin ingin mengubah skala menjadi MB:

const used = process.memoryUsage();
for (let key in used) {
  console.log(`Memory: ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}

Itu akan memberi Anda output seperti:

Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB
bvdb
sumber
0

Mari kita lakukan ini dengan sebuah Contoh

Contoh berikut akan menunjukkan kepada Anda bagaimana peningkatan penggunaan memori sebenarnya akan meningkatkan rssdanheapTotal

const numeral = require('numeral');
let m = new Map();
for (let i = 0; i < 100000; i++) {
    m.set(i, i);
    if (i % 10000 === 0) { 
        const { rss, heapTotal } = process.memoryUsage();
        console.log( 'rss', numeral(rss).format('0.0 ib'), heapTotal, numeral(heapTotal).format('0.0 ib') )
    } 
}

Menjalankan Di atas akan memberi Anda sesuatu seperti ini:

rss 22.3 MiB 4734976 4.5 MiB
rss 24.2 MiB 6483968 6.2 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 27.6 MiB 9580544 9.1 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 29.3 MiB 11419648 10.9 MiB
rss 32.8 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB
rss 32.9 MiB 15093760 14.4 MiB

Ini jelas menunjukkan kepada Anda bagaimana menggunakan variabel dan terus menambah ruang yang dibutuhkan oleh itu meningkatkan heapTotal dan sesuai dengan Ukuran Set Residen ( rss)

Cherag Verma
sumber