簡體   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