Chrome Profiler Javascript内存泄漏

时间:2015-07-28 10:23:48

标签: javascript google-chrome memory-leaks profiler

我尝试编写带有内存泄漏的javascript代码,以便在Chrome中使用分析器。然而,似乎剖析器没有显示应该是什么。

这是我的代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="start_button">Start</button>
<button id="destroy_button">Destroy</button>

<script type="text/javascript" charset="utf-8">
var Leaker = function(){};

Leaker.prototype = {
                init:function(){
                        this._interval = null;
                        this.start();
                },
                start: function(){
                        var self = this;
                        this._interval = setInterval(function(){ self.onInterval(); }, 100);
                },
                onInterval: function(){ console.log("Interval"); }
};

$("#start_button").click(function(){
        if(leak !== null && leak !== undefined){
            return;
        }

        leak = new Leaker();
        leak.init();

});

$("#destroy_button").click(function(){
        leak = null;
});

var leak;

</script>

当我点击开始按钮时,您可以看到创建了一个新对象Leaker。 当我点击destroy时,该对象被设置为null(注意:但由于setInterval仍然有效,它不会被垃圾收集)。

问题:但是,当我使用Google Chrome Profiler时,我点击销毁后没有向我显示对Leaker实例的任何引用(但它应该向我显示这样的引用,因为我在上面提到过,setInterval的闭包仍然保持着它。)

在点击销毁按钮之前

Profiler Profiler before clicking on destroy button

点击破坏按钮后的Profiler(你可以看到我找不到leaker实例了,而它应该在那里)。

Profiler after clicking on destroy button

在控制台中,setInterval仍然在运行,尽管探查器向我们展示了Leaker实例不再存在。

Console & setInterval

我在垃圾收集的工作方式或Chrome分析器上遗漏了什么?

1 个答案:

答案 0 :(得分:2)

两个分析器之间的区别在于,在“销毁”leak之前,Leaker变量是全局的,而不是之后。所以它只是探测器(和javascript引擎)不能像你描述的那样工作。基本上,您可以看到全局变量,但不能看到本地范围的变量。我想根据范围进行不同的分配是有意义的。在将leak设置为null之前,它需要可供其他脚本使用。

您可以通过一个最小的示例看到探查器如何根据范围进行不同的工作:

var Leaker = function() {};

var Leaker2 = function() {};

// this one is going to be in the profiler
var leak = new Leaker();

(function(){
    // this one is not in the profiler
    var leak2 = new Leaker2();
    setInterval(function(){console.log(leak2)}, 500);
})()

编辑:

只是为了澄清,该对象仍在分析器中,并且仍然分配,但与全局不同。我只是创建了一个关于Chrome Profiler如何工作的最小示例。当变量是全局变量时,您将看到它并且可以在类过滤器中对其进行过滤,但如果不是,则不能。

现在,它显然仍然在某个地方。您可以在下拉菜单中办理登机手续,您会看到两个快照上都有Leaker:

enter image description here

在闭包中可能会创建副本,因此也可以分配上下文信息。