मैंने एक बहुत ही सरल परीक्षण मामला बनाया है जो एक बैकबोन दृश्य बनाता है, एक हैंडलर को एक घटना में संलग्न करता है, और एक उपयोगकर्ता-परिभाषित वर्ग को त्वरित करता है। मेरा मानना है कि इस नमूने में "निकालें" बटन पर क्लिक करने से, सब कुछ साफ हो जाएगा और मेमोरी लीक नहीं होनी चाहिए।
कोड के लिए एक jsfiddle यहां है: http://jsfiddle.net/4QhR2/
// scope everything to a function
function main() {
function MyWrapper() {
this.element = null;
}
MyWrapper.prototype.set = function(elem) {
this.element = elem;
}
MyWrapper.prototype.get = function() {
return this.element;
}
var MyView = Backbone.View.extend({
tagName : "div",
id : "view",
events : {
"click #button" : "onButton",
},
initialize : function(options) {
// done for demo purposes only, should be using templates
this.html_text = "<input type='text' id='textbox' /><button id='button'>Remove</button>";
this.listenTo(this,"all",function(){console.log("Event: "+arguments[0]);});
},
render : function() {
this.$el.html(this.html_text);
this.wrapper = new MyWrapper();
this.wrapper.set(this.$("#textbox"));
this.wrapper.get().val("placeholder");
return this;
},
onButton : function() {
// assume this gets .remove() called on subviews (if they existed)
this.trigger("cleanup");
this.remove();
}
});
var view = new MyView();
$("#content").append(view.render().el);
}
main();
हालाँकि, मैं स्पष्ट नहीं हूँ कि यह सत्यापित करने के लिए कि यह वास्तव में मामला है, Google Chrome के प्रोफाइलर का उपयोग कैसे किया जाए। एक गज़िलियन चीजें हैं जो ढेर प्रोफाइलर स्नैपशॉट पर दिखाई देती हैं, और मुझे नहीं पता कि अच्छा / बुरा क्या है, इसे कैसे डिकोड किया जाए। मैंने अभी तक इस पर जो ट्यूटोरियल देखे हैं, वे या तो मुझे "स्नैपशॉट प्रोफाइलर का उपयोग करने" के लिए कहेंगे या मुझे पूरे प्रोफिलर के काम करने के तरीके के बारे में विस्तृत रूप से बताएंगे। क्या केवल प्रोफाइलर को एक उपकरण के रूप में उपयोग करना संभव है, या क्या मुझे वास्तव में यह समझना है कि पूरी चीज को कैसे इंजीनियर किया गया था?
संपादित करें: इन जैसे ट्यूटोरियल:
क्या मैंने जो देखा है, उसमें से कुछ मजबूत सामग्री के प्रतिनिधि हैं। हालांकि, 3 स्नैपशॉट तकनीक की अवधारणा को पेश करने से परे , मुझे लगता है कि वे व्यावहारिक ज्ञान (मेरे जैसे शुरुआती के लिए) के मामले में बहुत कम पेशकश करते हैं। 'DevTools का उपयोग करके' ट्यूटोरियल एक वास्तविक उदाहरण के माध्यम से काम नहीं करता है, इसलिए इसका अस्पष्ट और सामान्य वैचारिक विवरण अत्यधिक उपयोगी नहीं है। 'जीमेल' उदाहरण के लिए:
तो आपको एक रिसाव मिला। अब क्या?
प्रोफाइल पैनल के निचले आधे हिस्से में लीक हुए ऑब्जेक्ट के रिटेनिंग पथ की जांच करें
यदि आवंटन साइट को आसानी से अनुमान नहीं लगाया जा सकता है (यानी घटना श्रोता):
आवंटन के लिए स्टैक ट्रेस को बचाने के लिए जेएस कंसोल के माध्यम से रिटेनिंग ऑब्जेक्ट के निर्माता को साधन दें
क्लोजर का उपयोग करना? निर्माण के दौरान निर्माण संपत्ति को सेट करने के लिए उपयुक्त मौजूदा ध्वज (जैसे goog.events.Listener.ENABLE_MONITORING) सक्षम करें
मैं खुद को पढ़ने के बाद अधिक उलझन में पाता हूं, कम नहीं। और, फिर, यह मुझे केवल चीजों को करने के लिए कह रहा है , न कि उन्हें कैसे करना है। मेरे दृष्टिकोण से, सभी जानकारी या तो बहुत अस्पष्ट है या केवल उस व्यक्ति के लिए समझ में आएगी जो पहले से ही इस प्रक्रिया को समझता था।
इन कुछ और विशिष्ट मुद्दों को @ जोनाथन नागुइन के जवाब में नीचे उठाया गया है ।
main
कि आप एक बार के बजाय 10,000 बार कॉल करें , और देखें कि क्या आप अंत में उपयोग में बहुत अधिक मेमोरी के साथ समाप्त होते हैं।