2017-01-02 11 views
0

私はそのようなクラスを使用します(Socket.ioを使用して)少しのWebSocketプロジェクト、に取り組んでいます:配列に格納され、そのクラスの複数のインスタンスがありますオブジェクト内のsetIntervalは、オブジェクトが削除されたときにガベージコレクションを防止しますか?

function myClass() { 
    // start server sync 
    window.setInterval(this.update.bind(this), 14); 

    // listen for socket.io events 
    io.on('my-event', doStuff); 
} 

。 は、しばらくすると、インスタンスはそのように削除されます:

myArr.splice(index, 1); 

配列が唯一の場所ですが、私は内のインスタンスを保存するので、私は、彼らは、配列からそれらを削除した後に、ガベージコレクタによって削除になるだろう、と思いました。

私が気づいた代わりに、彼らはまだ私のwebsocketイベントに応答します。私は、オブジェクトがウィンドウオブジェクトにバインドされているので、間隔がオブジェクトの削除を妨げるかどうか疑問に思っています。 クラスインスタンスを削除する前に間隔をクリアする必要がありますか?

または、イベントリスナーによってオブジェクトが削除されないようにしますか?

答えて

2

...インスタンスはそのように削除されます:

myArr.splice(index, 1); 

...代わりに私は、彼らはまだ私のWebSocketイベントに応答すること、気づきました。私は、オブジェクトがウィンドウオブジェクトにバインドされているので、間隔がオブジェクトの削除を妨げるかどうか疑問に思っています。クラスインスタンスを削除する前に間隔をクリアする必要がありますか?

はい、クリーンアップをさらに行う必要があります。 (メモリにそれを維持、今度はオブジェクトへの参照を持っている)、それに関連付けられたリソースをクリーンアップし、それがthis.update.bind(this)によって作成された関数への参照を解放するために、

  • クリア間隔:あなたがする必要があります。

  • イベントハンドラ関数への参照を削除するイベントリスナー(Webソケットイベントなど)をすべて削除します。イベントハンドラ関数は、おそらくメモリに保持されているオブジェクトへの参照を持っています。

  • オブジェクトへの他の参照(直接的または間接的な他の結合された関数など)も解放されていることを確認してください。

+0

ありがとう、私がする必要がある手順を指摘してください。私はそのような措置をしたのと同じように、すぐに報告します。 – Afterlame

0

はい、関数の値またはスコープを参照すると、そのガーベージが防止されます。

実際、関数からオブジェクトおよびスコープへのポインタは、JavaScriptのメモリリークの主な原因の1つです。このカテゴリの中で最も頻繁に使用されるのはクロージャで、しばしばイベントコールバック(そのカテゴリのタイマーを含む)に関連します。

オブジェクトをガベージ可能にするには、すべてのイベントハンドラの登録を解除し、タイマーを削除するようにしてください(DOMから要素を削除して参照を保持しないと、イベントハンドラは削除されます) 。

関連する問題