使用Chrome查找JavaScript内存泄漏

问题描述 投票:159回答:8

我创建了一个非常简单的测试用例,该用例创建了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浏览器的探查器来验证是否确实如此。堆探查器快照中显示了成千上万的内容,我不知道如何解码优缺点。到目前为止,我看过的教程只是告诉我“使用快照事件探查器”,或者就整个事件探查器的工作原理给了我非常详尽的宣言。是否可以仅将探查器用作工具,还是我真的必须了解整个项目是如何设计的?

EDIT:这样的教程:

Gmail memory leak fixing

Using DevTools

根据我所见,代表了一些更强大的材料。但是,除了介绍3快照技术的概念外,我发现它们对实践知识的提供很少(对于像我这样的初学者)。 “使用DevTools”教程无法通过一个真实的示例进行工作,因此它对事物的含糊和笼统的描述并不太有用。至于“ Gmail”示例:

因此您发现了泄漏。现在呢?

  • 检查“纵断面”面板下半部分中泄漏物体的固定路径

  • 如果无法轻松推断分配站点(即事件侦听器):

  • 通过JS控制台指示保留对象的构造函数以保存堆栈跟踪以进行分配

  • 使用闭包?启用适当的现有标志(即goog.events.Listener.ENABLE_MONITORING)以在构建过程中设置creationStack属性。

阅读后,我发现自己更加困惑,而不是更少。再说一遍,这只是告诉我要做某事,而不是告诉我如何做。从我的角度来看,那里的所有信息要么太含糊,要么只对已经了解此过程的人有意义。下面@Jonathan Naguin's answer中提出了一些更具体的问题。

我创建了一个非常简单的测试用例,该用例创建了Backbone视图,将处理程序附加到事件,并实例化了用户定义的类。我相信通过单击此示例中的“删除”按钮,...
javascript google-chrome backbone.js memory-leaks
8个回答
199
投票
三个快照技术,该技术最早由Loreena Lee和Gmail团队用于解决他们的一些内存问题。这些步骤通常是:

7
投票

6
投票

4
投票

3
投票

3
投票

2
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.