繁体   English   中英

JavaScript关闭内存泄漏

[英]JavaScript Closure Memory Leak

我有一个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之前指向的对象new MyClass()创建的对象,因为在调用me.do_thing()它被self引用。 但是,我本以为调用destroy()me.do_thing会抛弃构造函数范围内的变量(在new MyClass()调用中self )。

我也尝试过使用_.bind_.bind函数,但遇到了这里描述的同样未解决的问题: 'bound_this'引用的实例不是垃圾收集的

我不知道为什么它不是垃圾收集,但是将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;

即使你将它设置为null,我仍然是window对象的属性。 因此,“我”仍然在记忆中。

我认为这可能会有所帮助:

window.me = new MyClass();
me.do_thing();
delete window.me;

MyClass是一个全局变量。 它也是浏览器环境中窗口对象的属性。 它不是垃圾,所以不会被收集。

看起来像个bug。 顺便说一句me.destroy()是没有必要的。 它应该在没有它的情况下删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM