2012-05-15 17 views
6

मैं अपने ऐप में देख रहा हूं, विन 7 पर आईई प्रक्रिया से जुड़ी मेमोरी प्रत्येक पेज रीफ्रेश के साथ 20-30 एमबी तक चढ़ती है। एक बार जब मैं 1.5 जीबी तक पहुंच जाता हूं, तो ब्राउजर उत्तरदायी नहीं होता है। मैं आईई 9 का उपयोग कर रहा हूं, और इसे केवल आईई 9 में पुन: पेश कर सकता हूं। क्रोम, एफएफ, आई 7, या आईई 8 में ऐसा कोई मुद्दा नहीं है। वास्तव में, समस्या आईई 9 को संगतता मोड में चलाते समय भी नहीं होती है।आईई 9 मेमोरी लीक

विशेष रूप से, मैं सोच रहा हूं कि पेज रीफ्रेश के बाद भी स्मृति कैसे लीक हो सकती है। क्या किसी और ने इसे देखा है?

+1

यह एड्रेस के लिए एक बहुत मुश्किल मुद्दा है। मुझे लगता है कि यह कई कारणों से हो सकता है, क्षमा करें :-( – Sebas

+1

बड़े पैमाने पर आवेदन के लिए कोड स्निपेट प्रदान करने का कोई तरीका नहीं है। अगर मैं स्निपेट प्रदान कर सकता हूं, तो मेरे पास पहले से ही मेरा जवाब होगा क्योंकि इससे मुझे समस्या को कम करने की आवश्यकता होगी कोड के एक विशिष्ट क्षेत्र में। जैसा कि मेरा प्रश्न बताता है, मैं उन लोगों की तलाश में हूं जो मेरे जैसा ही स्थिति में भाग चुके हैं: पृष्ठ रीलोड (केवल आईई 9) के बाद मेमोरी रिसाव, साथ ही साथ कुछ स्पष्टीकरण कि यह कैसे हो सकता है एक सामान्य अर्थ में, –

+0

मेरा नया उत्तर रे देखें, अभी इस समस्या को समझ लिया गया है (उत्पाद की नवीनतम रिलीज के साथ एक ही समस्या थी) –

उत्तर

3

अतीत में, इंटरनेट एक्सप्लोरर में सामान्य जावास्क्रिप्ट चर और डीओएम ऑब्जेक्ट्स के बीच संदर्भों के साथ कुछ समस्याएं थीं। तो, अगर मैं सही ढंग से याद है, इस

var e = document.createElement('div'); 
var x = { elementReference: e }; 
e.jsReference = x; 

की तरह एक परिपत्र संदर्भ नहीं कचरा-एकत्र किया जाएगा, भले ही e और x करने के लिए कोई अन्य संदर्भ थे। ऐसा इसलिए है क्योंकि आईई ने डीओएम तत्वों और जावास्क्रिप्ट के लिए कचरा संग्रह के विभिन्न तरीकों का उपयोग किया था।

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

e.jsReference = null; 
x.elementReference = null; 

संपादित करें: आईई 8

में टेस्ट मैं इस साधारण परीक्षण वेबपेज लिखा था।

<html> 
    <head> 
    <title>Leak test</title> 
    <script> 
     function leak() { 
     var e = document.createElement('div'); 
     var x = { elementReference: e }; 
     e.jsReference = x; 
     } 

     function test() { 
     for (var i = 0; i < 10000; i++) 
      leak(); 
     alert('Done'); 
     } 
    </script> 
    </head> 
    <body> 
    <input type="button" value="test" onclick="test();" /> 
    </body> 
</html> 

मैंने आईई 8 में इसका परीक्षण किया, क्योंकि मेरे पास इस मशीन पर आईई 9 स्थापित नहीं है। हालांकि, यह अभी भी प्रासंगिक हो सकता है क्योंकि यह दिखाता है कि यह मुद्दा आईई के हाल के संस्करणों में भी मौजूद था और इस प्रकार यह आईई 9 में भी जारी रह सकता है।

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

आप आईई 9 में अपने लिए यह कोशिश कर सकते हैं। बेशक, आप शायद अपने कोड में 10000 सर्कुलरली रेफरिंग ऑब्जेक्ट्स आवंटित नहीं कर रहे हैं, लेकिन संभवतः आप बड़ी ऑब्जेक्ट्स बनाते हैं जिनमें कुछ परिपत्र संदर्भ हो सकते हैं जो आपको अभी तक नहीं मिला है।

+0

क्या यह प्रत्येक पृष्ठ रीलोड के साथ तेजी से बढ़ती स्मृति की व्याख्या करेगा? मैं इंप्रेशन कि होस्ट ऑब्जेक्ट्स और मूल ऑब्जेक्ट्स के बीच सर्कुलर रेफरी का मुद्दा प्रत्येक पृष्ठ रीलोड के साथ बढ़ती मेमोरी की व्याख्या नहीं करेगा। इसके अलावा, मैं स्पष्ट रूप से कोई सर्कुलर रेफरी नहीं बना रहा हूं। –

+0

@ user48 6 9 7 9 ने मेरा जवाब संपादित किया। – Imp

6

मुझे यकीन नहीं है कि यह आपका मुद्दा होगा, लेकिन मुझे यह आईई 9 मेमोरी लीक मुद्दा भी मिल रहा था जहां स्मृति बढ़ती जा रही थी और बढ़ रही थी (लगभग 20 एमजी प्रति ताज़ा/पृष्ठ परिवर्तन)।

यदि आप मॉडर्निजर का उपयोग कर रहे हैं (यह अब हालिया रिलीज में से एक में तय किया जाना चाहिए, 2.5+ मुझे विश्वास है), लेकिन यदि आप पुराने संस्करण का उपयोग कर रहे हैं (और इसे किसी भी कारण से अपडेट नहीं कर सकते हैं) तो आपको बस एक return कथन को प्रतिस्थापित करने की आवश्यकता है।

समस्या Modernizr/जियोलोकेशन & IE9 साथ हो रहा है, यह वास्तव में IE9 के साथ एक इनहेरिट मुद्दा है, नहीं इतना Modernizr है।

return 'geolocation' in navigator 

के बजाय:

return !!navigator.geolocation // this causes the memory leak (silly IE9) 

https://github.com/Modernizr/Modernizr/issues/513

उस लिंक पर एक नजर डालें, लेकिन मूल रूप जियोलोकेशन परीक्षण के लिए बदले बयान को बदलने की आवश्यकता है, और इस समस्या को ही ठीक कर देंगे!

+1

यह मेरी समस्या थी और आपके सुझाव ने मुझे बचाया। अच्छी तरह से योग्य upvote! –

+0

@danradu किसी भी समय :) हाँ, यह मुझे थोड़ी देर के लिए पागल भी चला गया ... खुशी है कि यह किसी और की मदद की! –

+1

वाह ... ऐसी समस्या का इतना आसान समाधान जो हमें थोड़ी देर के लिए परेशान कर रहा है। धन्यवाद! –