2012-12-10 12 views
10

मेरे Node.js परियोजना स्मृति लीक पीड़ित है, मैं पहले से ही निर्धारित किया है चरों की पहचान करने, मेरा मतलब है, मैं इस तरह कोड पता है:बंद होने की स्मृति रिसाव memwatch नोड के साथ बंद होने में अशक्त करने के लिए

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
}); 

कारण होगा मेमोरी लीक, इसलिए मैं इन चर को शून्य पर सेट करने के लिए कुछ कोड जोड़ता हूं;

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
    a = null; 
    b = null; 
    c = null; 
}); 

लेकिन मैं अभी भी लीक हो गया है, इसलिए मैं memwatch-node उपयोग करने के लिए क्या मेरी कोड के साथ गलत क्या है यह पता लगाने की कोशिश करते हैं।

और परिणाम दिखाता है कि closure रिसाव का कारण बनता है, लेकिन लक्षित करने के लिए पर्याप्त निर्दिष्ट नहीं है।

मैं इस

{ what: 'Closure', 
    '+': 12521, 
    size: '520.52 kb', 
    '-': 5118, 
    size_bytes: 533016 }, 

तरह JSON मिल गया है और अगर मैं अधिक विशिष्ट विवरण के बारे में जो बंद लीक कर रहा है हो सकता है मैं सोच रहा हूँ।

मैंने सभी बंद करने के लिए नाम असाइन किया है, लेकिन अभी भी काम नहीं कर रहा है।

+0

यह एक वस्तु शाब्दिक है। अपने आप में, "बंद" के साथ इसका कोई लेना-देना नहीं है, इसके गुणों में से एक को स्ट्रिंग 'क्लोजर' पर सेट करने के अलावा, जो '1982 डैटसन चेरी' भी हो सकता है। –

+0

तो किस तरह का ऑब्जेक्ट ऐसा करेगा? मैं अपने आप से "बंद" सेट नहीं करता हूं। – bxshi

+0

हाँ, मैं शर्मिंदा हूं, मैं बेहतर देख सकता हूं कि आपका प्रश्न अब क्या है। मैं memwatch दस्तावेज़ीकरण में रहा हूं लेकिन एक diff रिपोर्ट में 'क्या:' क्लोजर 'अनुभाग का सबूत नहीं मिल सकता है। [यह] (https://hacks.mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season/) इंगित करता है कि बंद करने की रिसाव की सूचना दी गई है लेकिन इस तरह से नहीं। यह कुछ उलझन में है। –

उत्तर

2

आप किस बंद होने के बारे में अधिक विशिष्ट नहीं प्राप्त कर सकते हैं। मेमवॉच को v8 ढेर का डंप हो जाता है और उसके बाद इसमें अंतर होता है और 5 लगातार कचरा संग्रहण घटनाओं के बाद, उस ऑब्जेक्ट प्रकार की गिनती बढ़ती जा रही है, तो लीक की रिपोर्ट करता है।

इसके अलावा, मेरा मानना ​​है कि आप बंद होने पर उलझन में हैं। The MDN page on closures एक अच्छा विवरण देता है। एक बंदरगाह एक चर नहीं है, लेकिन एक ऐसा दायरा जो संदर्भों को बनाए रखने के लिए कार्यों को सक्षम बनाता है और कोड के एक हिस्से में उपयोग किए जाने पर काम करना जारी रखता है, जहां वे परिवर्तनीय संदर्भ अन्यथा उपलब्ध नहीं होंगे।

यदि आप फ़ंक्शन के संदर्भ में चारों ओर फ़ंक्शंस पास करते हैं, तो यह बंद होना अन्य बंदियों का संदर्भ दे सकता है। तो, यह संभव है कि आपके पास एक ही बंद हो जो इसमें बहुत कुछ हो।

ऐसा करें: जब तक मेमवॉच शिकायत बंद नहीं कर देता तब तक आपके कोड के हिस्सों को अक्षम करें। फिर, उस कोड को देखो। यदि आप अभी भी उलझन में हैं, तो इस प्रश्न में अधिक जानकारी पोस्ट करें।

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