2014-10-31 7 views
5

मैं समझने की कोशिश कर रहा हूं कि जीसी को node.js. पर कैसे काम करता है। ऐसा लगता है कि v8 इंजन स्मृति को जारी नहीं करता है।क्यों node.js स्मृति जारी नहीं करता है?

मैंने एक http सर्वर को लागू करने वाली एक बहुत ही सरल लिपि बनाई है और मैं हर 3 सेकंड में मेमोरी उपयोग को स्ट्रीम में सहेजता हूं।

var http = require('http'), 
fs = require('fs'), 
heapdump = require('heapdump'), 
memwatch = require('memwatch'); 


http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(8888); 

console.log('Server running on port 8888.'); 

memwatch.on('leak', function(info) { 
    // look at info to find out about what might be leaking 
    console.log('============= MEMWATCH ON LEAK ============\n',info) 
}); 

memwatch.on('stats', function(stats) { 
    // do something with post-gc memory usage stats 
    console.log('============= MEMWATCH STATS ============\n', stats) 
}); 

var myStream = fs.createWriteStream('/tmp/logmem.log'); 

setInterval(function() { 
    var t = new Date().getTime(); 

    var memUsage = process.memoryUsage(); 
    var str = t+';heapUsed;'+memUsage.heapUsed+';0;0;0\n'+ 
       t+';heapTotal;'+memUsage.heapTotal+';0;0;0\n'+ 
       t+';rss;'+memUsage.rss+';0;0;0\n'; 
    myStream.write(str); 

}, 3000); 

मैं 30 अनुरोधों/सेकंड 30 के दौरान Node.js 0.10.33

मैं अपने http सर्वर से अनुरोध भेजने के लिए गैटलिंग उपयोग कर रहा हूँ के पिछले संस्करण (15 अनुरोधों/सेकंड उपयोग कर रहा हूँ तो दौरान 30 तो 100 अनुरोधों 30s के दौरान/सेकंड)

निम्नलिखित चार्ट प्रतिनिधित्व heapUsed, heapTotal और rssprocess.memoryUsage() memory usage after 3 tests

Aft द्वारा दिए गए उन परीक्षणों में, सर्वर पर कोई गतिविधि नहीं है लेकिन स्मृति 1 घंटे से अधिक के बाद भी जारी नहीं की जाती है।

memory usage after 80min

किसी ने मुझसे अगर यह होगा कि मेरे लिपि में एक स्मृति रिसाव है की v8 स्मृति के मानक व्यवहार है व्याख्या कर सकते हैं?

मदद

+0

क्या आपको इसके लिए कोई समाधान मिला है? मुझे अभी भी इसी तरह की समस्या का सामना करना पड़ रहा है। – ilse2005

उत्तर

0

मेरा अनुमान है आप प्रमुख संग्रह पर अमल करने के लिए स्मृति के उपयोग से अधिक नहीं किया है के लिए धन्यवाद। यह पर्याप्त नहीं है "पुरानी जगह" को "नई जगह" में बदल दिया गया था (http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection)।

आपको जीसी चलाने के लिए मजबूर करने की आवश्यकता है। अधिकांश अन्य रनटाइम एक प्रोग्रामेटिक कॉल को जीसी को चलाने के लिए मजबूर करने की अनुमति देते हैं लेकिन मुझे वी 8 के बारे में निश्चित नहीं है।

+0

आप कमांड लाइन में '--expose-gc' जोड़ सकते हैं और जीसी समकालिक रूप से ट्रिगर करने के लिए वैश्विक फ़ंक्शन' gc() 'उपलब्ध कराया जाएगा। – mscdex

+0

जीसी चलाने के लिए मजबूर मत करो। जब इसकी आवश्यकता होती है तो यह अपने आप पर एक अच्छी नौकरी करता है। – Joe

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