2015-03-21 6 views
7

What do the return values of node.js process.memoryUsage() stand for? से ज्ञात आरएसएस निवासी सेट आकार है, रैम में आयोजित प्रक्रिया की स्मृति का हिस्सा (बाइट्स में इस प्रक्रिया द्वारा रैम में कितनी मेमोरी आयोजित की जाती है) फ़ाइल का आकार 'text.txt' उदाहरण में प्रयुक्त की यहाँ है 370KB (378,880 बाइट्स)नोड प्रक्रिया मेमोरी उपयोग, निवासी सेट आकार लगातार बढ़ रहा है

var http = require('http'); 
var fs  = require('fs'); 
var express = require('express'); 
var app  = express(); 

console.log("On app bootstrap = ", process.memoryUsage()); 

app.get('/test', function(req, res) { 

    fs.readFile(__dirname + '/text.txt', function(err, file) { 
     console.log("When File is available = ", process.memoryUsage()); 
     res.end(file); 

    }); 

    setTimeout(function() { 
     console.log("After sending = ", process.memoryUsage()); 
    }, 5000); 

}); 

app.listen(8081); 

तो एप्लिकेशन बूटस्ट्रैप पर है: { rss: 22069248, heapTotal: 15551232, heapUsed: 9169152 } के बाद मैं 10 अनुरोध किया '/ परीक्षण' की स्थिति है:

When File is available = { rss: 33087488, heapTotal: 18635008, heapUsed: 6553552 } 
After sending   = { rss: 33447936, heapTotal: 18635008, heapUsed: 6566856 } 

इसलिए ऐप बूस्टर से 10nth अनुरोध आरएसएस 11378688 बाइट्स के लिए बढ़ाया गया है जो फ़ाइल के आकार से बड़ा समय है।

मुझे पता है कि यह कोड ग्राहकों को परिणाम लिखने से पहले प्रत्येक अनुरोध के लिए संपूर्ण डेटा.txt फ़ाइल को मेमोरी में बफर करेगा, लेकिन मुझे उम्मीद है कि 'टेक्स्ट.txt' के लिए अपेक्षित मेमोरी समाप्त हो जाने के बाद जारी किया गया? लेकिन यह मामला नहीं है?

सेकेंड कैसे अधिकतम आकार की रैम मेमोरी सेट अप करें जो नोड प्रक्रिया का उपभोग कर सकती है?

+1

इसलिए मैंने 'fs.readfile' भाग' पर टिप्पणी की और ये लॉग थे, 1 req 'भेजने के बाद = {आरएसएस: 31162368, हेपटॉटल: 18862880, हेपयूएसड: 10961672}' 10 वां req 'भेजने के बाद = {आरएसएस: 31596544, हेपटॉट : 18862880, heapUsed: 11393584} 'जो 424 केबी की तरह है, काफी वायर्ड है, मैं भी एक जवाब की तलाश में हूं। संपादित करें: यह http://stackoverflow.com/questions/16441601/node-express-memory-increase-on-every-request –

उत्तर

5

जेएस कचरा कलेक्टर आपके कोड के निष्पादन के तुरंत बाद नहीं चलता है। इस प्रकार निष्पादन के तुरंत बाद स्मृति मुक्त नहीं होती है। यदि आप मेमोरी खपत की परवाह करते हैं, तो आप बड़ी वस्तुओं के साथ काम करने के बाद स्वतंत्र रूप से जीसी चला सकते हैं। अधिक जानकारी आप here पा सकते हैं।

setTimeout(function() { 
    global.gc(); 
    console.log("After sending = ", process.memoryUsage()); 
}, 5000); 

अपनी स्मृति आवंटन आप v8-प्रोफाइलर साथ अपने सर्वर चलाने के लिए और एक ढेर स्नैपशॉट प्राप्त कर सकते में देखने के लिए। अधिक जानकारी here

+0

पाया गया है कि आपके प्रोग्राम के लिए 'gc' को उजागर करने के लिए, आपको नोड शुरू करना पड़ सकता है 'नोड - एक्सपोज़-जीसी'। –

1

अपना उदाहरण फिर से चलाने का प्रयास करें और प्रक्रिया को कचरा संग्रह चलाने के लिए कुछ समय दें। सिस्टम मॉनिटर के साथ अपनी प्रक्रिया 'स्मृति उपयोग पर नजर रखें और इसे कुछ समय बाद साफ़ करना चाहिए। यदि यह नीचे नहीं जाता है तो नीचे उल्लिखित प्रक्रिया से स्मृति उपयोग में प्रक्रिया अधिक नहीं हो सकती है।

node documentation के अनुसार स्मृति सीमा 32 बिट के लिए 512 एमबी और 64 बिट के लिए 1 जीबी है। यदि आवश्यक हो तो उन्हें बढ़ाया जा सकता है।

संबंधित मुद्दे