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) をメモリに保持しているselfようme.do_thing()です。しかし、私は への呼び出しを考えていたでしょう。これは、コンストラクターのスコープ内の変数destroy()を unsetすると (呼び出しで) 破棄されます。me.do_thingselfnew MyClass()

Underscore.JS の_.bind関数も使用してみましたが、ここで説明されている未解決の問題に遭遇しました

4

4 に答える 4

1

ガベージ コレクションが行われない理由はわかりませんが、プロトタイプの代わりにインスタンスに destroy メソッドを追加し、selfnull に設定するとうまくいくようです。

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

バグのように見えます。ところで me.destroy() は必要ありません。それなしで削除する必要があります。

于 2013-07-22T10:24:51.290 に答える
0

me は、null に設定しても window オブジェクトのプロパティです。このように「私」は記憶の中に残っています。

これが役立つと思います:

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