जावास्क्रिप्ट ऑब्जेक्ट को कैसे नष्ट करें?


81

हाल ही में, मैं अपने एक आवेदन के साथ आया, जो बहुत अधिक मेमोरी और 10 एमबी / सेकंड तक बढ़ जाता है।

इसलिए, मैं जावास्क्रिप्ट ऑब्जेक्ट और वेरिएबल्स को नष्ट करने का सबसे अच्छा तरीका जानना चाहता हूं ताकि मेमोरी की खपत कम रहे और मेरा एफएफ नष्ट न हो सके।

मैं पेज को फिर से लोड किए बिना हर 8 सेकंड के अंतराल में अपने दो जावास्क्रिप्ट को कॉल कर रहा हूं।

function refresh() {
    $('#table_info').remove();
    $('#table').hide();
    if (refreshTimer) {
        clearTimeout(refreshTimer);
        refreshTimer = null ;
    }
    document.getElementById('refresh_topology').disabled=true; 
    $('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123"));
    $("#topo").hide();
    $('#root').remove();
    show_topology();
}

मैं कैसे देख सकता हूं कि किस चर के कारण मेमोरी ओवरहेड और विधि उस प्रक्रिया के निष्पादन को रोक सकती है?


1
क्या आपने क्लोजर का उपयोग करके अपने कोड के अलग हिस्सों पर विचार किया है?
वाईएस

1
क्या आपने कुछ भी करने की कोशिश की है? उपयोग की तरह obj = null?
फ्लोरियन मार्गाइन

क) क्या करता show_topologyहै? --- बी) क्या आप कभी भी उन चीजों को साफ कर रहे हैं जिन्हें आप जोड़ते हैं #td_123? --- C) कहीं इसका लाइव संस्करण है?
डेस्टन

जवाबों:


93

आप अपने सभी कोड इस तरह से एक नाम स्थान के नीचे रख सकते हैं:

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

deleteकीवर्ड का उपयोग करने से संपत्ति का संदर्भ नष्ट हो जाएगा, लेकिन निम्न स्तर पर जावास्क्रिप्ट कचरा संग्रहकर्ता (जीसी) को अधिक जानकारी मिलेगी कि किन वस्तुओं को पुनः प्राप्त किया जाए।

आप अपने ऐप की मेमोरी प्रोफ़ाइल प्राप्त करने के लिए क्रोम डेवलपर टूल्स का भी उपयोग कर सकते हैं, और आपके ऐप में किन वस्तुओं को छोटा किया जाना चाहिए।


12
डेवलपर उपकरण प्राप्त करने के लिए F12 दबाएं। प्रोफाइल टैब पर जाएं और प्रोफाइल शुरू करने के लिए स्टार्ट पर क्लिक करें। आप जेएस सीपीयू, सीएसएस चयनकर्ता पर प्रोफाइलिंग कर सकते हैं और आप हीप स्नैपशॉट ले सकते हैं।
सारथ

3
या नवीनतम क्रोम में जेएस कंसोल में शब्द प्रदर्शन
डेविड मॉरो

शायद यह स्पष्ट है, लेकिन आप अपने नाम स्थान को "g" की तरह नाम दे सकते हैं और बहुत सारे टाइपिंग को बचा सकते हैं। G.curItem = ... का उपयोग करें var varItem = ... के बजाय और टाइपिंग को बचाने के साथ-साथ सभी वैश्विक मेमोरी आवंटन को खाली करने के लिए g = अपरिभाषित के लिए अनुमति देता है।
डेविड स्पेक्टर

31

आप वस्तुओं को हटा नहीं सकते हैं, उन्हें हटा दिया जाता है जब उनके लिए अधिक संदर्भ नहीं होते हैं। आप के साथ संदर्भ हटा सकते हैं delete

हालाँकि, यदि आपने अपनी वस्तुओं में परिपत्र संदर्भ बनाए हैं तो आपको कुछ चीजों को डी-कपल करना पड़ सकता है।


2
क्या आप एक परिपत्र संदर्भ का एक उदाहरण जोड़ सकते हैं जो कचरा कलेक्टर द्वारा पकड़ा नहीं जाएगा? एक दोस्त के लिए पूछ रहे हो! ;)
१२

@emilhem आप कचरा संग्रहकर्ता को संदर्भित कर सकते हैं और यह खुद को और इंटरनेट को हटा देगा - प्रत्यारोपण संभवतः CERN पर एक ब्लैकहोल बना रहा है। क्या आपने उस उदाहरण के बारे में सोचा है?
एल मैक

28

हालांकि मौजूदा उत्तरों ने इस मुद्दे को हल करने और प्रश्न के उत्तरार्ध के समाधान दिए हैं, लेकिन वे उस प्रश्न के पहले छमाही के स्वयं खोज पहलू का जवाब नहीं देते हैं:

"मैं कैसे देख सकता हूं कि कौन सा चर स्मृति उपरिव्यय का कारण बनता है ...?"

3 साल पहले यह उतना मजबूत नहीं हो सकता था, लेकिन क्रोम डेवलपर टूल " प्रोफाइल " खंड अब काफी शक्तिशाली और सुविधा संपन्न है। क्रोम टीम का उपयोग करने पर एक व्यावहारिक लेख है और इस तरह भी कचरा संग्रह (जीसी) जावास्क्रिप्ट में काम करता है, जो इस प्रश्न के मूल में है।

चूंकि deleteमूल रूप से योचाई अकोका द्वारा वर्तमान में स्वीकार किए गए उत्तर की जड़ है, इसलिए यह याद रखना महत्वपूर्ण है कि डिलीट क्या करता है। यह अप्रासंगिक है अगर अगले दो उत्तरों में जीसी कैसे काम करता है की अवधारणाओं के साथ संयुक्त नहीं है: यदि किसी वस्तु का मौजूदा संदर्भ है तो इसे साफ नहीं किया जाता है। उत्तर अधिक सही हैं, लेकिन शायद उनकी सराहना नहीं की जाती है क्योंकि उन्हें केवल 'डिलीट' लिखने की तुलना में अधिक विचार की आवश्यकता होती है। हां, एक संभव समाधान का उपयोग किया जा सकता है delete, लेकिन यह याद नहीं होगा कि मेमोरी रिसाव का कोई अन्य संदर्भ है या नहीं।

एक अन्य उत्तर में परिपत्र संदर्भों का उचित उल्लेख किया गया है और क्रोम टीम प्रलेखन कारण को सत्यापित करने के लिए बहुत अधिक स्पष्टता और उपकरण प्रदान कर सकता है।

चूँकि deleteयहाँ उल्लेख किया गया था, यह संसाधन को नष्ट करने के लिए भी उपयोगी हो सकता है । यह करता है नहीं वास्तविक समाधान है जो वास्तव में जावास्क्रिप्ट का कचरा कलेक्टर से संबंधित है में से किसी में मिलता है।


9

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


1

मुझे इस तरह की समस्या का सामना करना पड़ रहा था, और समस्याग्रस्त वस्तु के बच्चों के भीतर के HTML को बदलने का विचार था।

adiv.innerHTML = "<div...> the original html that js uses </div>";

गंदा लगता है, लेकिन यह काम करता है, के रूप में मेरी जान बचाई!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.