2010-06-21 7 views
6

पुस्तक सीखना jQuery का कहना है IE डोम एक समारोह को संदर्भित एक संपत्ति होने वस्तु के लिए स्मृति रिसाव है, और समारोह भी डोम वस्तु को संदर्भित है, इस प्रकार एक "परिपत्र संदर्भ" होने, इस तरह:इंटरनेट एक्सप्लोरर में, पृष्ठों से दूर नेविगेट करते समय भी स्मृति रिसाव क्यों रहती है?

onload = function() { 
    var foo = document.getElementById('foo'); 
    foo.onclick = function() { // DOM object foo's onclick property refers to a function 
     foo.innerHTML = "hello" // the function's body refers to the DOM object 
    }       // therefore circular reference 
} 

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

और:

[स्मृति रिसाव ... और] जिसके परिणामस्वरूप [संदर्भ] पाशन आईई द्वारा छोड़ा नहीं जा सकता जब भी हम पृष्ठ से निकल जाते।

ब्राउज़र बंद होने तक कभी भी मुक्त नहीं हुआ।

क्या यह सच है? जब कोई उपयोगकर्ता पृष्ठ छोड़ देता है तब भी IE उन स्मृति को क्यों जारी नहीं करता है? ऐसा इसलिए है क्योंकि उपयोगकर्ता Back पर क्लिक कर सकता है और पृष्ठ पर वापस आ सकता है, और IE पृष्ठ की स्थिति रखना चाहेगा? उस स्थिति में, यदि उपयोगकर्ता मेमोरी लीक पेज पर है, और उसके बाद Back पर क्लिक करता है, और फिर google.com पर जाता है? तो पृष्ठ किसी भी Back या Forward द्वारा देखने योग्य नहीं है, और ब्राउज़र को बंद किए बिना मेमोरी लीक समस्या दूर जा सकती है?

या ब्राउज़र बंद होने के बावजूद टैब बंद होने पर भी?

क्या इस तरह की मेमोरी रिसाव आईई 8 में भी होती है?

+0

कई कार्यक्रमों मेमोरी लीक से समस्या निपटाने के लिए असफल जारी करने के लिए असफल के लिए संदर्भ होल्डिंग; और नए आईई संस्करणों में कई मेमोरी लीक प्लग किए गए हैं, लेकिन इन सभी को इस आकार की एक परियोजना में प्लग करना मुश्किल है। – Piskvor

उत्तर

3

मेमोरी लीक प्रोग्राम बग का एक वर्ग है, इसलिए आप मूल रूप से पूछ रहे हैं "आईई छोटी गाड़ी क्यों है?"। इसका उत्तर जाहिर है, "क्योंकि एक प्रोग्रामर, कहीं, गलती की गई"।

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

मेमोरी लीक एक बदतर प्रकार का बग है, क्योंकि प्रोग्राम सही ढंग से काम करता प्रतीत होता है, लेकिन धीरे-धीरे अधिक से अधिक स्मृति का उपभोग करता है।

उदा। देखें इस विषय पर आगे पढ़ने के लिए http://en.wikipedia.org/wiki/Circular_reference और http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

+0

क्या उन "परिपत्र संदर्भ" में "पृष्ठ स्तर" दायरा नहीं है? इसलिए, जब यह पृष्ठ स्मृति को लीक कर रहा है और हम 'बैक' पर क्लिक करते हैं और google.com पर जाते हैं, तो वह पृष्ठ अनिवार्य रूप से 'बैक' और 'फॉरवर्ड' अनुक्रम से "गायब हो जाता है", और हम उस पृष्ठ से संबंधित सभी मेमोरी को मुक्त कर सकते हैं। –

+0

@ जियान लिन: हां, यह वही तरीका है जो * काम * करने के लिए है। हालांकि, आईई का एक प्रोग्रामर शायद यह जांचना भूल गया कि क्या सभी पृष्ठ संदर्भ सही ढंग से मुक्त किए गए हैं, और इसलिए आईई * सोचता है * यह सही ढंग से साफ हो गया है, इसने स्मृति में कुछ डेटा छोड़ा है और अब उनके बारे में नहीं जानता है। – Piskvor

+1

@ जियान: अगर यह काम करता है तो यह अच्छा होगा। तथ्य यह है कि यह समस्या बनी रहती है हालांकि यह इंगित करता है कि या तो कचरा कलेक्टर सोचता है कि स्मृति अभी भी ठीक से संदर्भित है (हालांकि शायद एक अप्रत्याशित मार्ग के माध्यम से) या कचरा कलेक्टर स्मृति को पुनः प्राप्त करने के लिए बहुत बेवकूफ है, या यहां तक ​​कि कोई कचरा कलेक्टर नहीं है । आईई के स्रोत के बिना समस्या का आकलन करना संभव नहीं है (या इसे अपनाना, जो एक बेहोश दूसरा सबसे अच्छा होगा)। –

1

रिसाव वहां है क्योंकि आवेदन के प्रोग्रामर में से एक (इस मामले में आईई) स्मृति (स्मृति, संसाधन) का सही ढंग से निपटान करने में विफल रहा है जो स्मृति का उपयोग कर रहा था।

MSDN the three commonest causes of leaks in managed applications पर विचार कर रहे हैं:

  • प्रबंधित वस्तुओं
  • अप्रबंधित संसाधनों
  • आहरण वस्तुओं
संबंधित मुद्दे