2013-04-18 22 views
10

v0.10.4nodejs setTimeout स्मृति रिसाव?

यहाँ सरल पाश है कि एक बढ़ती स्मृति के उपयोग में परिणाम है:

function redx(){ 
     setTimeout(function(){ redx() },1000); 
     console.log('loop'); 
} 

redx(); 

क्या मैं गलत कर रहा हूँ ??

संपादित

ठीक है, बस दायरे में टाइमआउट वस्तु को संदर्भित करने के सुझाव की कोशिश की और ऐसा लगता है कि कचरा संग्रहण टॉप से ​​40 सेकंड के बाद में लात होता, तो यहाँ संक्षिप्त है लॉग्स:

3941 रूट 20 0 32944 7284 4084 एस 4.587 3.406 0: ०१.३२ नोड
3941 रूट 20 0 32944 7460 4084 एस 2.948 3.489 0: ०१.५९ नोड
3941 रूट 20 0 32944 7516 4084 एस 2.948 3.515 0: ०१.६८ नोड
3941 रूट 20 0 33,968 8400 4112 एस 2.948 3.928 0: 02.15 नोड
3941 रूट 20 0 33968 8920 4112 एस 3.275 4.171 0: ०२.९८ नोड
3941 रूट 20 0 33968 8964 4112 एस 2.948 4.192 0: ०३.०७ नोड
3941 रूट 20 0 33968 9212 4112 एस 2.953 4.308 0: ०३.१६ नोड
3941 जड़ 20 0 33968 9212 4112 एस 2.953 4.308 0: ०३.२५ नोड
3941 रूट 20 0 33968 9212 4112 एस 3.276 4.308 0: ०३.३५ नोड
3941 रूट 20 0 33968 9212 4112 एस 2.950 4.308 0: ०३.४४ नोड

+0

अविश्वसनीय, मैं कल खुद को सोच रहा था। मेरा अनुमान है कि नोड अज्ञात फ़ंक्शन के बंद नहीं एकत्र करता है। – dualed

+0

आप किस ऑपरेटिंग सिस्टम पर काम कर रहे हैं? – dualed

+0

मैं ARCH के तहत इसका परीक्षण कर रहा हूं। – crankshaft

उत्तर

4

नहीं विचार क्यों है लेकिन स्पष्ट रूप से यदि आप फ़ंक्शन नोडजेस के दायरे में टाइमआउट ऑब्जेक्ट का संदर्भ देते हैं तो कचरा सही ढंग से एकत्र करेगा।

function redx(){ 
     var t = setTimeout(function(){ redx() },50); 
     console.log('hi'); 
} 

redx(); 
+0

धन्यवाद, मैंने अभी आपके कोड का परीक्षण किया है और दुर्भाग्य से मेरे लिए यह समस्या हल नहीं करता है और मुझे स्मृति खपत में कोई ध्यान देने योग्य अंतर नहीं दिखता है। – crankshaft

+0

सुधार, मैंने अभी इसे फिर से देखा और स्मृति उपयोग प्रारंभ में बढ़ता रहता है और फिर लगभग 40 सेकंड के बाद बाहर निकलता है! – crankshaft

+0

अजीब, मैं स्पष्ट रूप से मेमोरी उपयोग में वृद्धि देख सकता हूं और फिर प्रारंभिक मान पर वापस आ सकता हूं (मुझे लगता है कि जब जीसी kicks में) –

3

दरअसल, मुझे लगता है कि यह वी 8 कचरा कलेक्टर काम करता है।

मेरे सिस्टम पर, नोड ढेर 48 एमबी तक बढ़ता है और फिर स्थिर हो जाता है, इसलिए मुझे लगता है कि यदि आप अपने प्रोग्राम को लंबे समय तक चलते रहते हैं, तो स्मृति खपत अंततः स्थिर हो जाएगी।

आप वीसी कमांड लाइन विकल्प में से एक के साथ नोड लॉन्च करके जीसी को कब/कैसे लगा सकते हैं: thetrace_gc ध्वज।

रेडिस के साथ आपकी पहली कोशिशों में, आप प्रत्येक कॉल पर रेडिस से व्यवस्थित रूप से कनेक्ट/डिस्कनेक्ट कर रहे थे। यह कचरा उत्पन्न करता है। आपको एक बार कनेक्शन खोलना होगा और इसे कई बार इस्तेमाल करना होगा। फिर भी, जब भी मैं ऐसा करता हूं, स्मृति की खपत स्थिर हो जाती है। यहाँ Redis के साथ इस उदाहरण पर स्मृति की खपत का विकास है:

// something close to your initial function (when Redis was still in the picture) 
function redx(){ 
    var client = redis.createClient(); 
    client.get("tally", function(err, reply) { 
     client.quit(); 
    }); 
    setTimeout(function(){ redx() }, 50); 
} 

Evolution of memory consumption with Redis connect/disconnect

यहाँ, 60 एमबी के बाद स्थिरीकरण काफी स्पष्ट हो रहा है।

+0

धन्यवाद, हाँ उत्पत्ति मैंने सोचा था कि यह रेडिस/मेमकैच के साथ एक समस्या थी लेकिन कोड को कम से कम करने के बाद, मैंने पाया कि सेटटाइमआउट के परिणामस्वरूप यह रिसाव हुआ था। एक नया कनेक्शन खोलने का कारण यह है कि यह कई महीनों तक चल सकता है और मुझे यकीन नहीं था कि उस समय के लिए स्थानीयहोस्ट कनेक्शन खोलने पर भरोसेमंद होगा। – crankshaft

+0

मैं उपर्युक्त ग्राफ की पुष्टि कर सकता हूं। कुछ समय बाद नोडज अपनी स्मृति खपत को स्थिर करता है। यह अधिकांश जीसी में बहुत आम है। मेरे पास एक अलग-अलग दायरे उत्पन्न करके भी वही परिणाम थे जो सेटटाइमआउट लूप में 'रेडक्स()' को कॉल कर रहे थे। 'SetTimeout (redx.bind (null), 50) को कॉल करके भी वही ग्राफ था; '। मेरे ऊपर उपरोक्त उदाहरण में अनुमान है, 'var client = ...' अगले लूप के बाद पहुंच योग्य नहीं है, इसलिए यह थोड़ी देर बाद कचरा इकट्ठा हो जाता है, और इसलिए स्मृति रिसाव भी लागू नहीं होना चाहिए। यह रेडिस को मेम लीक उत्पन्न कर सकता है लेकिन यह चर्चा बंद है। –

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