2013-06-13 7 views
8

मैं इस मुद्दे के साथ 3 दिनों के लिए संघर्ष कर रहा हूं और उम्मीद कर रहा हूं कि किसी के पास जानकारी की कुछ जानकारी है जो मैं अभी तक मदद नहीं कर पाई मुझे बाहर (मैं बेताब हूँ!)। कुछ संदर्भ प्रदान करने के लिए:jQuery (2.0.2) खाली() एचटीएमएल() मेमोरी खपत लगातार बढ़ती है

ब्राउज़र: IE9.0.8112.16421 (64 बिट); jQuery संस्करण: 2.0.2

अनिवार्य रूप से मैं जो कर रहा हूं वह एक साधारण AJAX कॉल कर रहा है और कुछ जानकारी पुनर्प्राप्त कर रहा है जिसे मैं सफलता हैंडलर के माध्यम से तत्व में डाल रहा हूं। कोड के प्रासंगिक लाइनों नीचे दिखाया गया हैं:

var onLoadViewGroupSuccess = function(data) {   
    var target = $("#viewGroupContent"); 
    //for(var i=0;i<1000;i++) { 
     target.empty().html(data); 
    //} 
} 

लक्ष्य निम्नलिखित HTML टैग से मेल खाती है:

<tr id="viewGroupContent">...</tr> 

पाश के लिए बाहर टिप्पणी की ऊपर मुद्दा (जो पता लगाने के लिए मुश्किल है आवर्धन करने का इरादा है एकल घटना के माध्यम से ट्रिगर्स क्लिक करें)। अनिवार्य रूप से जब लूप जगह में है, तो एक ही आमंत्रण की स्मृति 46 एमबी से ~ 113 एमबी तक जाती है।

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

AJAX कॉल के बाहर लूप को स्थानांतरित करना (इसलिए 1000 AJAX कॉल करना) परिणामस्वरूप एक ही स्मृति प्रोफ़ाइल में परिणाम होता है (इसलिए किसी भी अस्पष्ट AJAX मेमोरी लीक को अस्वीकार कर दिया जाता है)। मैं जिस सामग्री को सम्मिलित कर रहा हूं वह एक टीडी टैग है जिसमें सामग्री की एक महत्वपूर्ण मात्रा होती है (यानी प्रत्येक HTML टैग के उदाहरण जो आप छवियों को शामिल करने के बारे में सोच सकते हैं) तो सोच रहा है कि अगर मैं जो सामग्री डाल रहा हूं वह रिसाव के लिए जिम्मेदार है।

मैंने आईई की खुद की सफाई करने की क्षमता के बारे में कुछ रोचक ब्लॉग पोस्ट पढ़े हैं जिनमें निम्नलिखित सबसे अधिक आशाजनक (http://com.hemiola.com/2009/11/23/memory-leaks-in-ie8/) शामिल हैं। दुर्भाग्य से, अब तक कोई समाधान या कामकाज नहीं है।

मुझे नुकसान हुआ है क्योंकि मैंने अपनी ऐप को नंगे हड्डियों तक तोड़ दिया है और आप $(...).empty().html(...) के साथ जितना भी कर सकते हैं उतना नहीं कर सकते हैं। मेमोरी रिसाव धीमी लेकिन लगातार है ....

इसके अलावा, एक एफवाईआई के रूप में, मैंने आंतरिक पंक्ति के साथ गैर jQuery समाधानों की कोशिश की है, तालिका पंक्ति को हटाने और इसे पुनर्निर्माण करने के लिए डीओएम विधियों और फिर तालिका में AJAX सामग्री डालने कोशिकाओं, छोड़े गए सामग्री को एक कचरा बिन डीआईवी में ले जा रहे हैं और फिर आंतरिक HTML का आह्वान करते हैं, सभी को कोई फायदा नहीं होता है, और कई मामलों में रिसाव खराब हो जाता है ...

+1

टेक्स्ट की इस दीवार को पढ़ने में आसान बनाने के लिए कृपया कुछ पैराग्राफ जोड़ें। –

+0

@ फ़ेलिक्सक्लिंग आशा है कि बेहतर है ... –

+0

'.html()' से पहले '.empty()' करने का क्या उपयोग है? '.html()' मान जोड़ने से पहले डीओएम खाली करने वाले पूरे एचटीएमएल को बदलना नहीं है? –

उत्तर

0

ऊपर मेरी अंतिम टिप्पणी देखें, ऐसा लगता है कि मैं क्या समझ रहा था मेमोरी लीक केवल जीसीएड होने की प्रतीक्षा कर रहे थे, लेकिन मेरे आवेदन की प्रकृति (यानि 99% नेविक्स के माध्यम से किए गए नेविगेशन के कारण) आईई बस एक पूर्ण पृष्ठ नेविगेशन नहीं हुआ था (यानि विंडो.टॉप अनलोडेड) । लॉग आउट करते समय यह ध्यान देने के लिए हुआ और अचानक आईई इंस्टेंस के लिए स्मृति 200-63 एमबी से कम हो गया ... मैंने मैन्युअल रूप से जीसी का आह्वान करने की कोशिश की (लेकिन यह काम नहीं कर रहा है ...)। तो अब के लिए, चीजों को साफ करने के लिए एक वास्तविक पृष्ठ नेविगेशन के साथ हर nth AJAX नेविगेशन को प्रतिस्थापित करने जा रहा है ... आदर्श नहीं है, लेकिन इस पल के लिए तब तक करेगा जब तक कि मैं एक बेहतर तरीका नहीं समझ पाता।

0

jQuery lib को अपडेट करने का प्रयास करें, बस यह जांचने के लिए कि इसमें कुछ सुधार है या नहीं।

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

0

क्या आपने प्राप्त डेटा को एक रैपर तत्व में डालने का प्रयास किया है जिसे आप अगले पुनरावृत्ति के दौरान हटाते हैं?

var onLoadViewGroupSuccess = function(data) { 
    var target = $("#viewGroupContent"); 
    //for(var i=0;i<1000;i++) { 
     target.find('>div').remove(); 
     target.append($('<div>').html(data)); 
    //} 
} 

अगर वहाँ clean() एपीआई आप इसे से छुटकारा पाने के लिए संबंधित रिसाव किसी तरह का है।

0

मैं एक ही समस्या है और हल इस तरह:

JQuery setInterval with append, increase memory

यदि डेटा लक्ष्य के समान है की तुलना करने के लिए है। यदि नहीं, डेटा डालें, अन्यथा, कुछ भी नहीं करें।

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