私は次のChromeバグをログに記録しました。これにより、コードに重大で明白でない多くのメモリリークが発生しました。
(これらの結果は、GCを実行するChrome Dev Toolsのメモリプロファイラを使用してから、収集されたガベージングされていないものすべてのヒープスナップショットを取得します。)
以下のコードでは、someClass
インスタンスはガベージコレクションされています(良好)。
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
ただし、この場合はガベージコレクションされません(不良)。
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
そして対応するスクリーンショット:
function() {}
オブジェクトが同じコンテキストで他のクロージャによって参照されている場合、クロージャ自体が到達可能かどうかにかかわらず、クロージャ(この場合は)はすべてのオブジェクトを「有効」に保つようです。
私の質問は、他のブラウザー(IE 9+およびFirefox)でのクロージャーのガベージコレクションについてです。私はJavaScriptヒーププロファイラーなどのWebkitのツールに精通していますが、他のブラウザーのツールについてはほとんど知らないため、これをテストすることができませんでした。
これら3つのケースのどれでIE9 +とFirefoxのガベージが インスタンスを収集しsomeClass
ますか?
unreachable
関数は実行されないため、実際には何も記録されません。