グーグルクローム(バージョン20.0.1132.47、Ubuntu 11.04 64ビット)のガベージコレクションについて質問があります。
ヒープダンプを比較し、メモリリークをチェックしているときに、クリーンアップされないインスタンスをいくつか発見しました。通常、この動作はプログラマーエラーまで追跡できますが、この場合、私はかなり無知です。
次のスクリーンショットを見てください
インスタンス「child@610739」は、子インスタンス自体の関数に属する「bound_this」インスタンスによってのみ参照されます。したがって、私の理解では、子インスタンスはガベージコレクションされる必要があります。これは、子インスタンスを保持している他の唯一の参照が子インスタンス自体であるためです('bound_this'関数を介して)。
chromeの'native_bind'関数にマップするunderscore.js''bindAll 'ユーティリティ関数(underscore.js#bindAll)を使用しています(bound_thisのECMAスクリプトwiki)
私はここで明らかな何かを見逃していますか?もしそうなら、誰かがこれらのインスタンスを生き続けているものを説明できますか?
更新:
その間に、これらのぶら下がっているインスタンスを表示しないchrominium(18.0.1025.168(Developer Build 134367 Linux)Ubuntu 11.10)で同じアプリケーションをテストしました。
更新2:
jsfiddleスニペットを提供するためのEsailijasのヒントに従って、基本的に行っていることを模倣したもの( http://jsfiddle.net/8gSTR/1/ )を作成しました。残念ながら、このフィドルを実行しても、アプリケーションで発生している不正行為は表示されません。'a'-インスタンスがまだ参照されている間に取得されたヒープダンプは、インスタンスを存続させるwindow.o配列からの参照にもかかわらず、似たようなものに見えます。
私の場合(スクリーンショット1)、そのような参照が欠落しているため、chromeがこれらのインスタンスを解放するのを妨げるものがわかりません...
更新3:
隠されたプロパティを有効にするためにloislosのアドバイスに従いました。結果(ブランチの1つが展開されている)は次のスクリーンショットで見ることができますが、それ以上はかかりません。