2013-10-23 8 views
6

पहनना पड़ता है मैं इस तरह के रूप में एक सरल http सर्वर है:Node.js में धाराओं का उपयोग करते समय मेमोरी रिसाव?

var http = require('http'); 

http.createServer(function (req, res) { 
    req.on('data', function (data) { 
    console.log('Got some data: ' + data); 
    }); 

    req.on('end', function() { 
    console.log('Request ended!'); 
    }); 

    res.end('Hello world!'); 
}).listen(3000); 

तो, मूल रूप से डिफ़ॉल्ट 101 नमूना, कुछ खास नहीं अब तक - सिवाय इसके कि मैं data और पठनीय req धारा के end घटना की सदस्यता लें। अब मुझे आश्चर्य है कि मुझे उन घटनाओं की सदस्यता समाप्त करनी है जब मुझे अब उनकी आवश्यकता नहीं है?

या क्या वे पठनीय स्ट्रीम समाप्त होने पर स्वचालित रूप से साफ़ हो जाते हैं?

इस तरह की कोड मेमोरी रिसाव हो सकती है?

+3

[यह] (http://stackoverflow.com/questions/5326300/garbage-collection-with-node-js) सहायक हो सकता है। – hexacyanide

+0

यह वास्तव में एक सामान्य ज्ञान में सहायक था। धन्यवाद :-) –

उत्तर

15

अपने सवाल का जवाब देने से पहले (इस उत्तर Node.js स्रोत कोड के revelant भागों के लिए लिंक शामिल हैं), की घटनाओं के बारे में बात करते हैं। जब आप ऐसा करते:

emitter.on('an-event', listener); 

listener एक listemitter से जुड़ी पर जुड़ जाता है। बाद में, जब emitter घटना को ट्रिगर करता है, तो यह सूची के माध्यम से ईवेंट द्वारा सब्सक्राइब किए गए सभी श्रोताओं को सूचित करता है। Node.js इवेंट emitters का जादू यह है कि आप खुद को उस सूची की घोषणा या प्रबंधन नहीं करते हैं।

हालांकि, जब भी आप .on() पर कॉल करते हैं, तो आप back-reference emitter -> श्रोता बनाते हैं। यह संदर्भ श्रोता को जीसी द्वारा एकत्रित होने से रोक देगा और यदि आपने सदस्यता समाप्त नहीं की है तो "रिसाव" बनाएं।

यह अक्सर node.js के साथ नहीं होता है, क्योंकि आमतौर पर, श्रोताओं के सामने उत्सर्जक नष्ट हो जाते हैं, लेकिन वास्तविक दुनिया का मामला जहां ऐसा होता है जब आपके पास लंबे समय से चलने वाला कनेक्शन होता है (ट्विटर स्ट्रीमिंग एपीआई लगता है) जो कभी-कभी फिर से जुड़ता है । यदि आप ईवेंट को अनधिकृत नहीं करते हैं, तो आपको पुराने कनेक्शन से ईवेंट मिल सकते हैं और लगता है कि वे नए पर लागू होते हैं। इससे आपको लगता है कि नया कनेक्शन बंद हो गया है।

node.js कुख्यात "possible leak detected" संदेश प्रिंट करेगा जब ऐसा लगता है कि आप श्रोताओं को अपंजीकृत करना भूल सकते हैं।

वापस अपने उदाहरण के लिए:

यह एक रिसाव नहीं बनाएगा क्योंकि सॉकेट (अनुरोध + रिज़ोल्यूशन) पहले नष्ट हो जाएगा। चूंकि यह emitter है, node.js forcibly remove all listeners होगा।

+0

उत्कृष्ट उत्तर, बहुत धन्यवाद, विशेष रूप से उस हिस्से के लिए जब उत्सर्जक नष्ट हो जाते हैं। :-) –

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