5

我有一个 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被引用。但是,我会认为调用, unsets会丢弃构造函数范围内的变量(在调用中)。selfme.do_thing()destroy()me.do_thingselfnew MyClass()

我也尝试过使用 Underscore.JS 的_.bind函数,但遇到了这里描述的同样未解决的问题:Instances referenced by 'bound_this' only are not garbage collected

4

4 回答 4

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;
于 2013-07-14T17:59:39.650 回答
0

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

于 2013-07-15T14:34:38.183 回答
0

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

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

window.me = new MyClass();
me.do_thing();
delete window.me;
于 2013-07-14T17:48:08.600 回答
0

看起来像一个错误。顺便说一句 me.destroy() 不是必需的。没有它就应该被删除。

于 2013-07-22T10:24:51.290 回答