ค่าส่งคืนของ node.js process.memoryUsage () คืออะไร


132

จากเอกสารอย่างเป็นทางการ (ที่มา ):

process.memoryUsage ()

ส่งคืนวัตถุที่อธิบายการใช้หน่วยความจำของกระบวนการโหนดที่วัดเป็นไบต์

var util = require('util');

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

สิ่งนี้จะสร้าง:

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

heapTotal และ heapUsed อ้างถึงการใช้หน่วยความจำของ V8

สิ่งที่ไม่RSS , heapTotalและheapUsedยืน?

อาจดูเหมือนคำถามเล็กน้อย แต่ฉันได้รับการมองและฉันไม่สามารถหาคำตอบที่ชัดเจนจนถึงขณะนี้

คำตอบ:


156

เพื่อที่จะตอบคำถามนี้เราต้องเข้าใจ Memory Scheme ของ V8 ก่อน

โปรแกรมที่รันอยู่จะแสดงผ่านพื้นที่ที่จัดสรรในหน่วยความจำเสมอ พื้นที่นี้เรียกว่ามีถิ่นที่อยู่ชุด V8 ใช้รูปแบบที่คล้ายคลึงกับ Java Virtual Machine และแบ่งหน่วยความจำออกเป็นเซ็กเมนต์:

  • รหัส : รหัสจริงที่กำลังดำเนินการ
  • สแต็ค : มีประเภทค่าทั้งหมด (ดั้งเดิมเช่นจำนวนเต็มหรือบูลีน) ที่มีพอยน์เตอร์อ้างอิงออบเจ็กต์บนฮีปและพอยน์เตอร์ที่กำหนดโฟลว์ควบคุมของโปรแกรม
  • ฮีป : ส่วนหน่วยความจำที่ใช้สำหรับจัดเก็บประเภทการอ้างอิงเช่นวัตถุสตริงและการปิด ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้มันง่ายที่จะตอบคำถาม:

  • rss : Resident Set Size
  • heapTotal : ขนาดทั้งหมดของฮีป
  • heapUsed : ฮีปใช้จริง

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


41
รูปภาพมีค่า 1,000 คำ
bmacnaughton

8
@bmacnaughton อันนี้มีค่า 1,013 คำ :)
alex

2
[rss, heapTotal, heapUsed] => ขนาดเป็นเมกะไบต์? กิโลไบต์? คุณสามารถเพิ่มสิ่งนั้นในคำตอบของคุณ? พวกเขาทุกหน่วยเดียวกันหรือไม่
Alexander Mills

heapTotal จัดการโดยโหนดอย่างไร ในแอพของฉันฉันเห็น heapTotal ทั้งหมดเพิ่มขึ้นอย่างต่อเนื่อง (โดยไม่คำนึงถึง GC) แม้ว่า heapUsed ยังคงถูก จำกัด ขอบเขต ฉันไม่เห็นคำอธิบายว่า heapTotal จัดการกับโหนดอย่างไร ... ฉันคิดว่ามันเป็นเพียงแค่ฮีปที่สงวนไว้สำหรับการจัดสรรในอนาคต แต่มีบางอย่างที่เคยปล่อยออกมา (ถ้าไม่ได้ใช้)? อะไรจะทำให้อยู่ในระดับสูง
logidelic

1
มีคุณสมบัติใหม่ "ภายนอก" ใน process.memoryUsage () ทุกคนรู้เกี่ยวกับที่

39

RSSคือขนาดชุดที่อยู่อาศัยส่วนของหน่วยความจำของกระบวนการที่เก็บไว้ใน RAM (ตรงข้ามกับพื้นที่สว็อปหรือส่วนที่อยู่ในระบบไฟล์)

กองเป็นส่วนหนึ่งของหน่วยความจำจากวัตถุจัดสรรใหม่จะมาจาก (คิดmallocใน C หรือnewใน JavaScript)

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับกองที่วิกิพีเดีย


4
ฉันไม่คิดว่ามันเป็นความทรงจำทั้งหมด บนเครื่องของฉันหน่วยความจำทั้งหมดคือ 8GB แต่เมื่อฉันเรียกใช้กระบวนการโหนดอย่างง่าย RSS แสดงประมาณ 13MB ดังนั้นฉันคิดว่ามันแสดงให้เห็นว่าหน่วยความจำใน RAM มีหน่วยความจำเท่าใดโดยกระบวนการนี้
Stefan

1
@tefan ถูกต้องฉันเจอข้อผิดพลาดบางอย่างในตอนนั้น แต่ RSS ดูเหมือนจะเชื่อถือได้สำหรับฉันแล้ว
Mahn

4
ความแตกต่างระหว่างheapTotalและheapUsedคืออะไร
tiblu

3
@tiblu heapTotalเป็นพื้นที่ฮีปที่ปันส่วนทั้งหมดโดยเอ็นจิน V8 พื้นฐานสำหรับการจัดสรรแบบไดนามิก heapUsedคือหน่วยความจำที่ใช้ภายในพื้นที่ทั้งหมดนั้น ทั้งสองจัดการโดย V8 และอาจมีการเติบโต / หดเมื่อใดก็ตามที่จำเป็น
elyas-bhy

4
รูปภาพที่แสดงพื้นที่หน่วยความจำที่แตกต่างกัน: apmblog.dynatrace.com/wp-content/uploads/2015/11/DK_2.png
elyas-bhy

7

การกระจาย Node.jsอธิบายดังต่อไปนี้:

heapTotal และ heapUsedอ้างถึงการใช้หน่วยความจำของ V8 ภายนอกหมายถึงการใช้หน่วยความจำของวัตถุ C ++ ที่ผูกไว้กับวัตถุ JavaScript ที่จัดการโดย V8 rss, Resident Set Sizeคือจำนวนพื้นที่ว่างที่อยู่ในอุปกรณ์หน่วยความจำหลัก (นั่นคือส่วนย่อยของหน่วยความจำที่จัดสรรทั้งหมด) สำหรับกระบวนการซึ่งรวมถึงฮีปส่วนของรหัสและสแต็ก

ค่าที่กล่าวถึงทั้งหมดแสดงเป็นไบต์ ดังนั้นหากคุณต้องการพิมพ์พวกเขาคุณอาจต้องการขายให้เป็น MB:

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

ที่จะให้ผลลัพธ์เช่น:

Memory: rss 522.06 MB
Memory: heapTotal 447.3 MB
Memory: heapUsed 291.71 MB
Memory: external 0.13 MB

0

ลองทำด้วยตัวอย่าง

ตัวอย่างต่อไปนี้จะแสดงให้คุณเห็นว่าการเพิ่มขึ้นของการใช้หน่วยความจำจะเพิ่มrssและheapTotal

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') )
    } 
}

การทำงานด้านบนจะให้อะไรแบบนี้กับคุณ:

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

สิ่งนี้แสดงให้คุณเห็นอย่างชัดเจนถึงวิธีการใช้ตัวแปรและการเพิ่มพื้นที่อย่างต่อเนื่องที่ต้องการโดยจะเพิ่ม heapTotal และขนาดของ Resident Set ที่สอดคล้องกัน ( rss)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.