2011-08-16 27 views
11

कोड का निम्न भाग एक स्मृति रिसाव पैदा करेगा।क्या jQuery.data एक स्मृति रिसाव का कारण बन सकता है?

data फ़ंक्शन के jQuery दस्तावेज़ प्रलेखन के अनुसार मेमोरी लीक से बचा जाता है। यह पुष्टि करना उपयोगी होगा कि निम्नलिखित सुरक्षित है या नहीं।

var MyClass = function(el) { 
    // Store reference of element in object. 
    this.element = $(el); 
}; 

// Store reference of object in element. 
$('#something').data('obj', new MyClass('#something')); 
+0

आप वैश्विक जेएस ऑब्जेक्ट में संदर्भ क्यों नहीं सहेजते? –

+0

@ant_Ti मैं दो तरह का उपयोग करना चाहता हूं। उदाहरण के लिए, एक ईवेंट हैंडलर में मैं 'obj' तक पहुंच बनाना चाहता हूं, लेकिन मैं 'obj' से तत्व तक पहुंचने में सक्षम होना चाहूंगा। –

+0

मैंने परिपत्र संदर्भों के उल्लेखों को हटाने के लिए प्रश्न संपादित किया है, क्योंकि इस उदाहरण में एक नहीं है। (हालांकि ऐसा लगता है कि यह हो सकता है) – mikerobi

उत्तर

7

स्पष्ट रूप से कोड जो खड़ा है, वह अतिरिक्त स्मृति लेगा जब तक कि डोम तत्व अभी भी डोम से जुड़ा हुआ न हो। लेकिन मुझे लगता है कि आप यह पूछ रहे हैं कि डीओएम तत्व अब उपयोग में आने के बाद अतिरिक्त मेमोरी का उपयोग जारी रखेगा या नहीं।

अद्यतन: जॉय के जवाब (जो उन्होंने बाद में हटा दिया है) के लिए धन्यवाद, मैं कुछ समय बिताया memory leaks in javascript पर पढ़ने, और ऐसा लगता है नीचे पैरा में मेरी मान्यताओं सही नहीं हैं। क्योंकि डोम तत्वों शुद्ध कचरा संग्रहण का उपयोग नहीं करते, इस तरह एक परिपत्र संदर्भ में दोनों डोम तत्व और से कभी जारी किया जा रहा जावास्क्रिप्ट वस्तु रोका जा सके। हालांकि, मुझे विश्वास है कि इस उत्तर का शेष अभी भी सही है।

जावास्क्रिप्ट इंजन कचरा संग्रहण कैसे कार्यान्वित करते हैं, इस बारे में गहन ज्ञान के बिना, मैं विषय पर आधिकारिक रूप से बात नहीं कर सकता। हालांकि, कचरा संग्रह की मेरी सामान्य समझ से मुझे लगता है कि आपका कोड इस अर्थ में "सुरक्षित" होगा कि #something तत्व डीओएम से हटा दिया गया है, जिसके परिणामस्वरूप MyClass ऑब्जेक्ट में केवल उस ऑब्जेक्ट का संदर्भ होगा जिसमें कोई अन्य कनेक्शन नहीं है । कचरा कलेक्टर का ग्राफ एल्गोरिदम और पहचान करने के लिए है कि डोम तत्व और उसके MyClass वस्तु "अंतरिक्ष में तैरते रहे हैं" में सक्षम बाकी सब से असंबद्ध होना चाहिए।

इसके अलावा, jQuery डीओएम से निकाले जाने के बाद दिए गए डीओएम तत्व से जुड़े डेटा और घटनाओं को पट्टी करने के अपने रास्ते से बाहर चला जाता है। documentation से:

jQuery सुनिश्चित करता है कि डेटा जब डोम तत्वों jQuery विधियों के माध्यम से निकाल दिए जाते हैं हटा दिया जाता है, और उपयोगकर्ता पृष्ठ छोड़ जब।

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

तब तक जब तक आपके पास DOM तत्व हटा दिए जाने के बाद MyClass ऑब्जेक्ट का संदर्भ देने के लिए कुछ और नहीं है, तो आपके पास स्मृति रिसाव नहीं होना चाहिए।

+0

धन्यवाद जो वास्तव में मदद करता है –

-4

डेटा विशेषता केवल स्ट्रिंग मानों को संग्रहित करती है।

+2

jQuery में यह ऐरे या ऑब्जेक्ट सहित कोई जावास्क्रिप्ट प्रकार हो सकता है। –

+0

@ant_Ti - यह कहां कहता है कि डॉक्टर में? – Neal

+0

[.data()] (http://api.jquery.com/data/) विवरण कहता है ** मान ** नया डेटा मान; यह ऐरे या ऑब्जेक्ट सहित कोई जावास्क्रिप्ट प्रकार हो सकता है। –

0

मैं इसे Javascritp इंजन पर निर्भर करता है लगता है।

आपके पास एक परीक्षण करने के लिए सटीक सवाल है। मैंने ऑब्जेक्ट में एक लंबी स्ट्रिंग जोड़ा और एक बड़े पाश में संभावित रिसाव चलाया।

नतीजतन, मैं IE8 में और क्रोम में लीक में नहीं सोचता।

लेकिन मैं these leakeage patterns को पुन: पेश नहीं कर सका।

0

यह एक स्मृति रिसाव हो सकता है। jQuery.data विधि के सिद्धांत डोम तत्व के लिए कैश डेटा के लिए एक डाटा भीतरी वर्ग का उपयोग कर सकते हैं।

बेशक, जब आप कैश डेटा हटाते हैं, तो jQuery डेटा को अपरिवर्तित करेगा। लेकिन आंतरिक कैश एक बढ़ती सरणी है, जब आप इसे करते हैं, तो यह आगे बढ़ेगा।

तो अंत में, बहुत बड़ी कैश सरणी होगी, जो यादगार रिसाव का नेतृत्व करेगी। एक लंबे समय तक चलने वाले वेब ऐप में, यह स्मृति क्रैश को रिसाव कर सकता है।

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

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