नोड .js प्रक्रिया .emoryUsage () के लिए वापसी मान क्या हैं?


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

इस प्रश्न का उत्तर देने के लिए, पहले V8 की मेमोरी स्कीम को समझना होगा।

एक चल रहे कार्यक्रम को हमेशा मेमोरी में आवंटित कुछ स्थान के माध्यम से दर्शाया जाता है। इस स्पेस को रेजिडेंट सेट कहा जाता है । V8 जावा वर्चुअल मशीन के समान एक योजना का उपयोग करता है और मेमोरी को सेगमेंट में विभाजित करता है:

  • कोड : वास्तविक कोड निष्पादित किया जा रहा है
  • स्टैक : सभी मान प्रकार (पूर्णांक या बूलियन की तरह आदिम) होता है, जिसमें पॉइंटर पर ऑब्जेक्ट्स को संदर्भित करने वाले पॉइंटर्स और प्रोग्राम के नियंत्रण प्रवाह को परिभाषित करने वाले पॉइंटर्स होते हैं।
  • हीप : एक मेमोरी सेगमेंट जो ऑब्जेक्ट्स, स्ट्रिंग्स और क्लोजर जैसे संदर्भ प्रकारों को स्टोर करने के लिए समर्पित है। यहाँ छवि विवरण दर्ज करें

अब सवाल का जवाब देना आसान है:

  • rss : निवासी सेट का आकार
  • heapTotal : ढेर का कुल आकार
  • heapUsed : हीप वास्तव में उपयोग किया जाता है

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


41
एक तस्वीर 1000 शब्दों के लायक हो सकती है।
bmacnaughton

8
@bmacnaughton यह एक शब्द 1013 के लायक है :)
एलेक्स

2
[rss, heapTotal, heapUsed] => मेगाबाइट में आकार? किलोबाइट? क्या आप इसे अपने उत्तर में जोड़ सकते हैं? क्या वे सभी समान इकाइयाँ हैं?
अलेक्जेंडर मिल्स

हाइपोटैटल को नोड द्वारा कैसे प्रबंधित किया जाता है? अपने ऐप में मैं heapTotal (जीसी की परवाह किए बिना) लगातार बढ़ता जा रहा हूं, भले ही heapUsed बंधे हुए हैं। मैंने कोई स्पष्टीकरण नहीं देखा है कि कैसे नोड द्वारा प्रबंधित किया जाता है ... मुझे लगता है कि यह भविष्य के आवंटन के लिए सिर्फ आरक्षित हीप है, लेकिन क्या यह कभी जारी किया गया है (यदि उपयोग नहीं किया जा रहा है)? यह उच्च रहने के लिए क्या कारण होगा?
लॉजिडेलिक

1
वहाँ एक नई संपत्ति है "बाहरी" प्रक्रिया पर

39

राष्ट्रीय स्वयंसेवक संघ है निवासी सेट आकार , रैम में आयोजित प्रक्रिया की स्मृति के भाग (के रूप में स्वैप स्पेस या भाग फाइल सिस्टम में आयोजित करने का विरोध किया)।

ढेर स्मृति के भाग है जहाँ से नव आवंटित वस्तुओं से आएगा है (के बारे में सोच mallocसी में, या newजावास्क्रिप्ट में)।

आप विकिपीडिया पर ढेर के बारे में अधिक पढ़ सकते हैं ।


4
मुझे नहीं लगता कि यह कुल मेमोरी है। मेरी मशीन पर कुल मेमोरी 8GB है, लेकिन जब मैं एक सरल नोड प्रक्रिया चलाता हूं, तो RSS 13MB के आसपास दिखाता है, इसलिए मुझे लगता है कि यह वास्तव में दिखाता है कि इस प्रक्रिया द्वारा RAM में कितनी मेमोरी होती है।
स्टीफन

1
@ सही, मैं कुछ समय बाद बग में आया, लेकिन आरएसएस अब मेरे लिए विश्वसनीय लगता है।
Mahn

4
बीच क्या अंतर है heapTotalऔर heapUsed?
टिबलू

3
@tiblu heapTotalगतिशील आवंटन के लिए अंतर्निहित V8 इंजन द्वारा कुल आवंटित हीप स्थान है। heapUsedउस कुल स्थान के भीतर उपयोग की जाने वाली मेमोरी है। दोनों को V8 द्वारा प्रबंधित किया जाता है, और जब भी आवश्यक हो, बढ़ने / सिकुड़ने के अधीन होते हैं।
इलियास-भाय

4
एक छवि जो विभिन्न मेमोरी स्पेस को दिखाती है
elyas-bhy

7

Node.js doumentation यह वर्णन इस प्रकार है:

heapTotal और heapUsed V8 के मेमोरी उपयोग को संदर्भित करता है। बाह्य C8 द्वारा प्रबंधित जावास्क्रिप्ट ऑब्जेक्ट्स के लिए बाध्य C ++ ऑब्जेक्ट्स के मेमोरी उपयोग को संदर्भित करता है। आरएसएस, रेजिडेंट सेट साइज़ , प्रक्रिया के लिए मुख्य मेमोरी डिवाइस (जो कि कुल आवंटित मेमोरी का एक सबसेट है) में जगह की मात्रा है, जिसमें ढेर, कोड सेगमेंट और स्टैक शामिल हैं।

सभी उल्लिखित मूल्य बाइट्स में व्यक्त किए गए हैं। इसलिए, यदि आप उन्हें प्रिंट करना चाहते हैं, तो आप शायद उन्हें 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

यह आपको स्पष्ट रूप से दिखाता है कि चर का उपयोग कैसे किया जाता है और इसके द्वारा आवश्यक स्थान को लगातार बढ़ाना हीपोटल को बढ़ाता है और इसके अनुसार निवासी सेट आकार ( rss)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.