मैं वर्तमान में एक वेबसाइट विकसित कर रहा हूं जो शुद्ध जावास्क्रिप्ट है और jQuery & jQuery UI पुस्तकालयों पर भारी निर्भर करता है (यह साइट एक आम जनता द्वारा उपयोग के लिए नहीं है, इसलिए प्रगतिशील वृद्धि एक सख्त आवश्यकता नहीं है इस परियोजना के लिए)। मैं निम्नलिखित कोड को क्रियान्वित करने पर एक महत्वपूर्ण स्मृति रिसाव का सामना कर रहा हूँ:डेवलपर टूल्स के साथ जावास्क्रिप्ट क्लोजर की पहचान करें
oDialogBox = $("<div>...</div>");
/* Add useful things to the dialog box here */
oDialogBox.appendTo("body");
oDialogBox.dialog({
/* Other dialog box settings here */
close: function(event, ui) {
oDialogBox.dialog("destroy");
oDialogBox.remove();
oDialogBox = null;
}
});
इस डायलॉग बॉक्स में किसी भी समय, मैं बनाने रहा हूँ, को दूर करने और jQuery यूआई बटन, multiselects के उदाहरण की एक बड़ी संख्या को संशोधित (प्रति एरिक हाइंड्स द्वारा निर्मित मल्टीइलेक्ट विजेट) और क्लिक ईवेंट हैंडलर पर। JQuery यूआई दस्तावेज़ीकरण के अनुसार, oDialogBox पर .remove() को कॉल करना परिणामस्वरूप सभी बच्चे विजेट अनबाउंड और हटाए जा सकते हैं। फिर भी मेरा अलग डोम पेड़ एक बड़ी संख्या में कचरा तत्व दिखाता है जो जीसी एकत्र नहीं कर रहा है।
यह अत्यधिक संभावना है कि मैंने बंद होने के बड़े सेट को याद किया है जिसे सुरक्षित रूप से समाप्त करने की आवश्यकता है। मैं निम्नलिखित कैसे कर सकता हूं:
1) मैं कैसे पहचान सकता हूं कि कौन से बंद एक दिए गए अलग DOM ऑब्जेक्ट को जीवित रखते हैं (या तो फ़ायरफ़ॉक्स या क्रोम में)?
2) बंद होने के पूर्ण सेट को मानते हुए, कचरे के संग्रह के लिए डीओएम तत्व को चिह्नित करने के लिए परिवर्तनीय आवश्यकता को कम करने के अलावा कुछ भी करने की आवश्यकता है?
3) मैंने यह भी देखा है कि पृष्ठ द्वारा संग्रहीत सरणी की मेरी सूची विशाल है और इसमें डीओएम तत्वों के संदर्भ शामिल हैं जो जीसी द्वारा एकत्र नहीं किए जा रहे हैं। जावास्क्रिप्ट से सरणी की सफाई के लिए एक दस्तावेज सबसे अच्छा अभ्यास है और सभी तत्वों को हटाने के लिए चिह्नित किया जा सकता है? (नोट: यह स्मृति रिसाव के स्रोत के लिए एक वर्तमान प्रमुख संदिग्ध है)
"* डीओएम तत्वों के संदर्भ वाले एरे की सूची *" - क्या हो सकता है कि डीओएम तत्वों को कचरा नहीं मिला हो? आप इस सूची का निरीक्षण कैसे करते हैं? – Bergi
क्रोम डेवलपर टूल का उपयोग करते समय, मैं प्रोफाइलर टूल के साथ हीप स्नैपशॉट ले रहा हूं। मेरा परीक्षण चलाने के बाद, ढेर में लगभग 50 एमबी अतिरिक्त मेमोरी ली गई थी। यह प्रोफाइलर द्वारा "(सरणी)" वस्तुओं में संग्रहीत होने के रूप में पहचाना गया था। यादृच्छिक निरीक्षण में अलग डोम पेड़ के तत्वों के लिए jQuery गुण पाए गए हैं। मुझे खाली सरणी के प्रमाण भी मिले हैं जिन्हें एकत्र नहीं किया जा रहा है।मैं अभी भी यह पहचानने की कोशिश कर रहा हूं कि मेरे कोड में परिभाषित किए गए किसी भी सरणी में 10k + ऑब्जेक्ट्स की सूची में छिप रहे हैं। –