【发布时间】:2015-07-28 10:23:47
【问题描述】:
为了在 Chrome 中使用分析器,我尝试编写内存泄漏的 javascript 代码。但是,探查器似乎没有显示它应该是什么。
这是我的代码:
<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 的闭包仍然保留着它)。
点击销毁按钮后的探查器(你可以看到我再也找不到泄漏者实例,而它应该在那里)。
在控制台中,setInterval 仍在运行,尽管分析器向我们显示没有更多的 Leaker 实例。
我在垃圾收集的工作方式或 Chrome 分析器中遗漏了什么吗?
【问题讨论】:
标签: javascript google-chrome memory-leaks profiler