Я создал очень простой тестовый пример, который создает представление Backbone, прикрепляет обработчик к событию и создает пользовательский класс. Я считаю, что нажав кнопку "Удалить" в этом примере, все будет очищено и не должно быть утечек памяти.
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, чтобы убедиться, что это, по сути, случай. Есть gazillion вещи, которые появляются на снимке профайлера кучи, и я понятия не имею, как декодировать, что хорошо/плохо. Учебники, которые я видел на нем, пока либо просто говорят мне "использовать профилировщик моментальных снимков", либо дать мне подробный манифест о том, как работает весь профайлер. Можно ли просто использовать профилировщик в качестве инструмента, или мне действительно нужно понять, как все это было спроектировано?
EDIT: Учебники, подобные этим:
Исправление утечки памяти Gmail
Являются представителем какого-то более сильного материала там, из того, что я видел. Однако, невзирая на концепцию 3 Snapshot Technique, я нахожу, что они предлагают очень мало практических знаний (для новичка, подобного мне). Учебник "Использование DevTools" не работает на реальном примере, поэтому его неопределенное и общее концептуальное описание вещей не слишком полезно. Что касается примера Gmail:
Итак, вы обнаружили утечку. Теперь что?
Изучите путь удержания просочившихся объектов в нижней половине панели "Профили".
Если сайт распределения не может быть легко выведен (например, прослушиватели событий):
Инструмент конструктор сохраняющего объекта через консоль JS для сохранения трассировки стека для распределений
Использование закрытия? Включите соответствующий существующий флаг (т.е. Goog.events.Listener.ENABLE_MONITORING), чтобы установить свойство createStack во время построения
Я больше смущен, прочитав это, не меньше. И, опять же, это просто говорит мне делать что-то, а не как их делать. С моей точки зрения, вся информация там слишком расплывчата или будет иметь смысл только для того, кто уже понял этот процесс.
Некоторые из этих более конкретных проблем были подняты в ответе @Джонатан Нагуин ниже.