मेरे पास जावास्क्रिप्ट कचरा संग्रह/स्मृति रिसाव प्रश्न है। मैं ओएस एक्स 10.8.4 पर क्रोम 28.0.1500.71 का उपयोग कर रहा हूं।जावास्क्रिप्ट क्लोजर मेमोरी लीक
निम्नलिखित कोड me
द्वारा आयोजित की गई जगह को कभी भी अस्वीकार नहीं करता है और मैं इस बारे में अनजान हूं कि क्यों।
var MyClass = function() {
this.x = 1;
var self = this;
this.do_thing = function() {
self.x++;
};
};
MyClass.prototype.destroy = function() {
delete this.do_thing;
};
var me = new MyClass();
me.do_thing();
me.destroy();
me = null;
// the MyClass object formerly known as 'me' is still allocated here
// (as evidenced by Chrome's heap profiler)
क्रोम अभिव्यक्ति new MyClass()
(उद्देश्य यह है कि me
null
करने के लिए सेट किए जाने से पहले की ओर इशारा) स्मृति में है क्योंकि यह me.do_thing()
करने के लिए कॉल में self
द्वारा संदर्भित है के द्वारा बनाई गई वस्तु रखने के लिए लगता है। हालांकि, मैंने destroy()
पर कॉल सोचा होगा, जो me.do_thing
को अनसेट करता है, new MyClass()
कॉल में कन्स्ट्रक्टर (self
) के दायरे में चर को फेंक देगा।
मैंने अंडरस्कोर.जेएस के _.bind
फ़ंक्शन का उपयोग करने का भी प्रयास किया है, लेकिन यहां वर्णित एक ही अनसुलझा समस्या में चलाया गया है: Instances referenced by 'bound_this' only are not garbage collected।
कृपया "वैश्विक चर 'me'" और "MyClass' ऑब्जेक्ट" के बीच सटीक और अंतर करें। चर निश्चित रूप से स्मृति में रहेगा, लेकिन यह कोई समस्या नहीं है (और यदि यह है, तो आप इसे 'विंडो' से हटा सकते हैं, सिमोनलेंग के उत्तर देखें)। क्या क्रोम इंगित करता है कि 'MyClass' ऑब्जेक्ट अभी भी जिंदा है? – delnan
उचित बिंदु; यह 'MyClass' ऑब्जेक्ट है जिसे * 'i' द्वारा संदर्भित किया गया था जिसे कभी भी हटाया नहीं जाता है। मैंने यह स्पष्ट करने के लिए अपने प्रश्न के शब्द को अद्यतन किया। – soney
ऐसा लगता है कि वी 8 में एक बग है, मैंने इसके खिलाफ एक मुद्दा खोला: https://code.google.com/p/v8/issues/detail?id=2791 –