2012-12-02 5 views
8

मैंने देखा है कि मेरे node.js ऐप का आरएसएस (निवासी सेट साइज) समय के साथ बढ़ रहा है, और मेरे सर्वर पर "जेएस ऑब्जेक्ट आवंटन असफल - आउट ऑफ़ मेमोरी" त्रुटि होने पर विचार कर रहा है, ऐसा लगता है कि ऐसा लगता है कारण।क्या कुछ टोपी तक पहुंचने तक, प्रत्येक अनुरोध के साथ नोड.जेएस 'आरएसएस (निवासी सेट साइज) के लिए बढ़ना सामान्य है?

मैं निम्नलिखित बहुत ही सरल नोड ऐप सेट:

var express = require('express'); 

var app = express(); 
app.get('/',function(req,res,next){ 
    res.end(JSON.stringify(process.memoryUsage())); 
}); 
app.listen(8888); 

बस नीचे पकड़ "ताज़ा" हॉटकी @ http द्वारा: // स्थानीय होस्ट: 8888/आरएसएस/ढेर/आदि मैं देख सकते हैं। बढ़ो, जब तक आरएसएस 50 एमबी से ऊपर न हो जाए (इससे पहले कि मैं ऊब जाऊं)। कुछ मिनट इंतजार कर रहे हैं और वापस आ रहे हैं, आरएसएस गिरता है - संभवतः जीसी चला गया है।

मैं यह पता लगाने की कोशिश कर रहा हूं कि यह मेरा वास्तविक नोड ऐप क्यों क्रैश हो रहा है ... मेरा उत्पादन ऐप जल्दी से 100 एमबी आरएसएस आकार को हिट करता है, जब यह क्रैश होता है तो यह आम तौर पर 200 एमबी-300 एमबी के बीच होता है। जैसा कि मैं सबसे अच्छा कह सकता हूं, यह बहुत बड़ा नहीं होना चाहिए (नोड 1.7 जीबी को संभालने में सक्षम होना चाहिए या तो, मुझे विश्वास है), लेकिन फिर भी मैं इस तथ्य से चिंतित हूं कि मेरे उत्पादन सर्वर पर आरएसएस आकार ऊपर की ओर बढ़ता है (गिरावट दुर्घटनाओं का प्रतिनिधित्व करते हैं):

enter image description here

+0

जहां तक ​​मुझे पता है कि जब तक स्मृति की आवश्यकता नहीं होती है तब तक ऑपरेटिंग सिस्टम अप्रयुक्त पृष्ठों को बाहर कर देता है, तब तक आप आरएसएस को अपने आप नीचे नहीं देख पाएंगे अगर सिस्टम पर कुछ भी स्मृति के लिए प्रतिस्पर्धा नहीं कर रहा है । – chrixian

+1

शायद आप [कुख्यात वॉलमार्ट मेमोरी लीक] का अनुभव कर रहे हैं (http://www.joyent.com/blog/walmart-node-js-memory-leak), जिसे अब 'v0.10.22' में तय किया गया है। –

+1

मेरे लिए v8 में संग्रहित कचरा का यह व्यवहार सामान्य लगता है – exebook

उत्तर

1

यह सवाल काफी पहले से ही वर्ष है और अभी तक कोई जवाब नहीं है, इसलिए मैं मेरा है, जो जे conrod जो है द्वारा 2013-2014 से एक blog post का संदर्भ में फेंक देंगे "पर काम किया मोबाइल फोन के लिए वी 8 जावास्क्रिप्ट इंजन को अनुकूलित करना "

वी 8 कचरा इकट्ठा करते समय कुशल होने की कोशिश करता है और इसके लिए यह बढ़ता हुआ अंकन और आलसी सफाई का उपयोग करता है।

मूल रूप से वृद्धिशील अंकन यह ट्रैक करने के लिए ज़िम्मेदार है कि आपकी वस्तुओं को एकत्र किया जा सकता है या नहीं।

वृद्धिशील अंकन तब शुरू होता है जब ढेर एक निश्चित दहलीज आकार तक पहुंच जाता है।

आलसी सफाई बढ़ती अंकन के दौरान कचरे के रूप में चिह्नित वस्तुओं को इकट्ठा करने और अन्य समय लेने वाले कार्यों को करने के लिए जिम्मेदार है।

एक बार वृद्धिशील अंकन पूरा होने के बाद, आलसी सफाई शुरू होती है। सभी वस्तुओं को लाइव या मृत चिह्नित किया गया है, और ढेर जानता है कि व्यापक रूप से मेमोरी मेमोरी को कितना मुक्त किया जा सकता है। हालांकि, इस स्मृति को जरूरी नहीं किया जाना चाहिए, और व्यापक रूप से देरी से वास्तव में कुछ भी नुकसान नहीं पहुंचाएगा। तो एक ही समय में सभी पृष्ठों को साफ़ करने के बजाय, कचरा कलेक्टर सभी आवश्यक पृष्ठों तक पृष्ठों को एक आवश्यक आधार पर साफ़ करता है। उस बिंदु पर, कचरा संग्रहण चक्र पूरा हो गया है, और वृद्धिशील अंकन फिर से शुरू करने के लिए स्वतंत्र है।

मुझे लगता है कि यह बताता है कि आपका सर्वर एक निश्चित टोपी तक पहुंचने तक इतनी मेमोरी आवंटित क्यों करता है। बेहतर समझने के लिए मैं जे कॉनरोड के ब्लॉग पोस्ट "A tour of V8: Garbage Collection" पढ़ने की सलाह देता हूं।

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