我有一个Javascript垃圾收集/内存泄漏问题。我在OS X 10.8.4上使用Chrome 28.0.1500.71。
以下代码永远不会释放me
所持有的空间,而且我对其原因一无所知。
var MyClass = function() {
this.x = 1;
var self = this;
this.do_thing = function() {
self.x++;
};
};
MyClass.prototype.destroy = function() {
delete this.do_thing;
};
var me = new MyClass();
me.do_thing();
me.destroy();
me = null;
// the MyClass object formerly known as 'me' is still allocated here
// (as evidenced by Chrome's heap profiler)
Chrome似乎将内容new MyClass()
(me
之前指向的对象“设置为null
)创建的对象保留在内存中,因为{{1}引用了该对象在调用self
时。但是,我原以为调用me.do_thing()
,取消设置destroy()
会抛弃构造函数范围内的变量(me.do_thing
调用中的self
)。< / p>
我也尝试过使用Underscore.JS的new MyClass()
函数,但遇到了这里描述的同样未解决的问题:Instances referenced by 'bound_this' only are not garbage collected。
答案 0 :(得分:1)
我不知道为什么它不是垃圾收集,但是将destroy方法添加到实例而不是原型并将self
设置为null,显然会有效:
var MyClass = function() {
this.x = 1;
var self = this;
this.do_thing = function() {
self.x++;
};
this.destroy = function() {
delete this.do_thing;
self = null;
};
};
var me = new MyClass();
me.do_thing();
me.destroy();
me = null;
答案 1 :(得分:0)
即使你将它设置为null,我仍然是window对象的属性。因此,“我”仍在记忆中。
我认为这可能有所帮助:
window.me = new MyClass();
me.do_thing();
delete window.me;
答案 2 :(得分:0)
MyClass是一个全局变量。它也是浏览器环境中窗口对象的属性。它不是垃圾,所以不会被收集。
答案 3 :(得分:0)
看起来像个错误。 顺便说一句me.destroy()是没有必要的。它应该在没有它的情况下删除。