2009-07-03 15 views
8

मैं ब्राउज़रों, एमएसपी में मेमोरी लीक को समझने की कोशिश करने के लिए पढ़ रहा हूं। अर्थात। मैं समझता हूं कि रिसाव जावास्क्रिप्ट इंजन और डीओएम ऑब्जेक्ट पेड़ के बीच कचरा संग्रह एल्गोरिदम में मेल नहीं खाती है, और अतीत बनी रहेगी। जो मुझे समझ में नहीं आता है वह है (क्यों लेखों में कुछ कथनों के अनुसार मैं पढ़ रहा हूं) ब्राउज़र द्वारा पृष्ठ को अनलोड किए जाने के बाद स्मृति को पुनः दावा नहीं किया जाता है। किसी वेबपृष्ठ से दूर जाने से सभी बिंदुओं और जावास्क्रिप्ट ऑब्जेक्ट्स को उस बिंदु पर दायरे से बाहर रखना चाहिए, है ना?वेब पेज को अनलोड करने के बाद जावास्क्रिप्ट मेमोरी लीक

+0

बिल्कुल क्यों वे लीक हैं :) स्मृति को पुनः दावा नहीं किया जा सकता है। –

उत्तर

8

यहां समस्या है। आईई के पास डोम और जावास्क्रिप्ट के लिए एक अलग कचरा कलेक्टर है। वे दोनों के बीच परिपत्र संदर्भों का पता नहीं लगा सकते हैं।

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

याद रखने की एक और अच्छी बात यह है कि यदि आप नोड्स को हटा रहे हैं, तो हैंडलर को पहले हटाने के लिए एक अच्छा विचार है। Ext-js में Ext.destroy विधि है जो केवल यही करती है (यदि आपने एक्सटी का उपयोग करके हैंडलर सेट किया है)।

उदाहरण

// Leaky code to wrap HTML elements that allows you to find the custom js object by adding 
//a reference as an "expando" property 
function El(node) { 
    this.dom = node; 
    node.el = this; 
} 

तब Microsoft IE तो यह सब घटना संचालकों और expando गुण हटा दिया जब आंतरिक रूप से उतारने को हैक कर लिया, इसलिए यह js साथ यह कर की तुलना में काफी तेज है। यह फिक्स हमारी स्मृति समस्याओं को ठीक करने लग रहा था, लेकिन सभी समस्याएं नहीं हैं क्योंकि लोगों को अभी भी समस्या है।

MS's description of the problem

MS releases patch that "fixes" memory leaks:

Blog about fixed memory leaks

IE still has some problems

हमारी कंपनी में, हम ext-js का उपयोग करें। एक्सटी-जेएस का उपयोग करके ईवेंट हैंडलर को हमेशा सेट करके, जिसमें आंतरिक साफ-सफाई दिनचर्या होती है, हमने मेमोरी लीक का अनुभव नहीं किया है। हकीकत में, स्मृति उपयोग बढ़ता है लेकिन 4 जीबी रैम वाली मशीन के लिए लगभग 250 एमबी पर रुक जाता है। हमें नहीं लगता कि यह बहुत बुरा है क्योंकि हम जेएस फाइलों के बारे में 2 एमबी (असंपीड़ित) लोड करते हैं और पृष्ठ पर सभी तत्व गतिशील होते हैं।

इस बारे में बहुत कुछ कहना है और हमने इस बड़े पैमाने पर शोध किया है जहां मैं काम करता हूं। एक और विशिष्ट सवाल पूछने के लिए स्वतंत्र महसूस करें। मैं आपकी मदद कर सकता हूं।

+0

आपके शोध के लिए धन्यवाद, आईई 9 में बिल्कुल सुधार हुआ है? हम आंतरिक HTML संपत्ति को सेट करके केवल लीक का अनुभव कर रहे हैं, ग्राहक VMWARE पर चल रहे हैं और स्मृति तेजी से लीक हो रही है। इंट्रानेट उपयोगकर्ताओं को ऐप को फिर से खोलने के लिए पूछना समाधान नहीं है, लेकिन हमारे पास कोई विकल्प नहीं है। –

+1

@AlexanderN यदि आप 'आंतरिक HTML' सेट करते समय स्मृति वृद्धि का अनुभव कर रहे हैं, तो यह बहुत संभावना है कि आप उनसे जुड़े हैंडलरों को अलग किए बिना डोम से नोड्स को हटाकर लीक बना रहे हैं। किसी भी हैंडलर को हटाने के बिना आपको कभी भी 'आंतरिक HTML' को ओवरराइट नहीं करना चाहिए। यह किसी भी ब्राउज़र के लिए जाता है। –

3

सबसे अच्छी बात जो मैंने कभी पढ़ी है Javascript memory leaks डोलगास क्रॉकफोर्ड द्वारा लिखी गई थी।

अपने प्रश्न का उत्तर देने के लिए, हाँ, ब्राउज़र बिल्कुल उचित समय पर सभी ऑब्जेक्ट्स (और सबसे महत्वपूर्ण रूप से, ईवेंट हैंडलर) को अनलोड करें। अगर ऐसा होता है, तो इसमें लीक नहीं होंगे :)

0

आपको उन्हें समझने की ज़रूरत नहीं है - वे ब्रोशर्स में बग हैं और संस्करणों से संस्करणों में तय किए जा रहे हैं।

+0

सिर्फ इसलिए कि एक संस्करण ठीक हो जाता है, बग को रद्द नहीं करता है; ब्राउज़र के पुराने संस्करण तब तक उपयोग में रहेंगे जब तक आप अपने सभी ग्राहकों को अपग्रेड नहीं कर सकते। वेब विकास करते समय समझते हैं कि ब्राउज़र कैसे काम करता है अविश्वसनीय रूप से महत्वपूर्ण है। –

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