2012-12-06 15 views
7

मैं वर्तमान में एक वेबसाइट विकसित कर रहा हूं जो शुद्ध जावास्क्रिप्ट है और 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) मैंने यह भी देखा है कि पृष्ठ द्वारा संग्रहीत सरणी की मेरी सूची विशाल है और इसमें डीओएम तत्वों के संदर्भ शामिल हैं जो जीसी द्वारा एकत्र नहीं किए जा रहे हैं। जावास्क्रिप्ट से सरणी की सफाई के लिए एक दस्तावेज सबसे अच्छा अभ्यास है और सभी तत्वों को हटाने के लिए चिह्नित किया जा सकता है? (नोट: यह स्मृति रिसाव के स्रोत के लिए एक वर्तमान प्रमुख संदिग्ध है)

+0

"* डीओएम तत्वों के संदर्भ वाले एरे की सूची *" - क्या हो सकता है कि डीओएम तत्वों को कचरा नहीं मिला हो? आप इस सूची का निरीक्षण कैसे करते हैं? – Bergi

+0

क्रोम डेवलपर टूल का उपयोग करते समय, मैं प्रोफाइलर टूल के साथ हीप स्नैपशॉट ले रहा हूं। मेरा परीक्षण चलाने के बाद, ढेर में लगभग 50 एमबी अतिरिक्त मेमोरी ली गई थी। यह प्रोफाइलर द्वारा "(सरणी)" वस्तुओं में संग्रहीत होने के रूप में पहचाना गया था। यादृच्छिक निरीक्षण में अलग डोम पेड़ के तत्वों के लिए jQuery गुण पाए गए हैं। मुझे खाली सरणी के प्रमाण भी मिले हैं जिन्हें एकत्र नहीं किया जा रहा है।मैं अभी भी यह पहचानने की कोशिश कर रहा हूं कि मेरे कोड में परिभाषित किए गए किसी भी सरणी में 10k + ऑब्जेक्ट्स की सूची में छिप रहे हैं। –

उत्तर

1

मुझे डर है कि मेरे पास # 1 के लिए एक अच्छा जवाब नहीं है। मुझे अपने लिए कोई भी अच्छा उपकरण नहीं मिला है, यहां तक ​​कि पिछले कुछ सालों में विकास उपकरण कितने अच्छे हैं। सबसे अच्छी सलाह जो मैं दे सकता हूं वह हमेशा चीजों को सबसे छोटे दायरे में रखना है जो आप संभवतः कर सकते हैं। अगर चीजें बचती नहीं हैं, तो यह समझना आम तौर पर आसान है कि संदर्भ कहां होना चाहिए।

# 2 के रूप में, और चिंताएं हो सकती हैं। यदि परिवर्तनीय v1 द्वारा संदर्भित ऑब्जेक्ट कुछ फ़ंक्शन के नि: शुल्क चर से बंद हो जाता है, तो v1 को हटाने के लिए उन्हें कचरा संग्रहण के लिए योग्य नहीं बनाया जाएगा यदि किसी अन्य चर v2 किसी अन्य फ़ंक्शन में v1 से अधिक हो जाता है। तो मुझे लगता है कि अगर आप वास्तव में "बंद होने का पूरा सेट" का मतलब है, तो आपको पूरा सेट होना चाहिए। लेकिन यह बालों वाली हो सकती है। दोबारा, यदि अधिकांश ऑब्जेक्ट में केवल संकीर्ण क्षेत्रों में संदर्भ हैं, तो ये समस्याएं बहुत कम गंभीर हैं।

# 3 के लिए, आप किस प्रकार के सरणी पर चर्चा कर रहे हैं? यदि यह jQuery संग्रह है, तो शायद आपके पास बस उनमें से बहुत सारे हैं। एकमात्र कारण है कि मैं उनके लिए लंबे समय तक रहने के लिए जानता हूं, उन्हें ईवेंट हैंडलर को बाध्य करना है, और यह माता-पिता तत्वों पर ईवेंट प्रतिनिधिमंडल द्वारा लगभग हमेशा बेहतर होता है। यदि यह आप स्वयं के कस्टम सरणी हैं, तो क्या आपके पास वास्तव में उन सरणी में संदर्भ संग्रहीत करने का एक अच्छा कारण है जो किसी भी पर्याप्त अवधि के लिए आखिरी हैं? मुझे शायद ही कभी मिल गया है।

+0

जब मैंने शुरुआत में आपकी प्रतिक्रिया पढ़ी, तो मेरी तत्काल प्रतिक्रिया "नहीं, सरणी पूरी तरह जरूरी है।" लेकिन रात में इसके बारे में सोचने के बाद, मैं वास्तव में केवल "सरणी" हिट करते समय फॉर्म डेटा संग्रह के लिए विशेष divs की गतिशील सूची बनाए रखने के लिए सरणी का उपयोग कर रहा हूं। ऑब्जेक्ट्स और jQuery चयनकर्ता पर कक्षाओं के अधिक व्यापक उपयोग के साथ संभवतः एक ही चाल की जा सकती है। –

+0

तत्वों की आईडी है, तो एक और संभावना उनके आईडी की एक सरणी है। यह बहुत हल्का वजन है, और शायद डीओएम कक्षाओं से अधिक लक्षित हो सकता है। –

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