私は現在、純粋な JavaScript であり、jQuery および jQuery UI ライブラリに大きく依存する Web サイトを開発しています (このサイトは一般ユーザーによる使用を意図していないため、プログレッシブ エンハンスメントはこのプロジェクトの厳密な要件ではありません)。次のコードを実行すると、重大なメモリ リークが発生します。
oDialogBox = $("<div>...</div>");
/* Add useful things to the dialog box here */
oDialogBox.appendTo("body");
oDialogBox.dialog({
/* Other dialog box settings here */
close: function(event, ui) {
oDialogBox.dialog("destroy");
oDialogBox.remove();
oDialogBox = null;
}
});
このダイアログ ボックスではいつでも、jQuery UI ボタン、マルチセレクト (Eric Hynds によって作成されたマルチセレクト ウィジェットによる)、およびクリック イベント ハンドラーの多数のインスタンスを作成、削除、および変更しています。jQuery UI ドキュメントによると、oDialogBox で .remove() を呼び出すと、すべての子ウィジェットのバインドが解除され、削除されるはずです。しかし、切り離された DOM ツリーには、GC が収集していない大量のガベージ要素が表示されます。
安全に終わらせる必要のある大量のクロージャーを見逃している可能性が高いです。次のことを行うにはどうすればよいですか。
1) 特定の切り離された DOM オブジェクトを存続させているクロージャーを特定するにはどうすればよいですか (Firefox または Chrome のいずれか)。
2) クロージャーの完全なセットが特定されたと仮定すると、ガベージ コレクションの DOM 要素を確実にマークするために、変数を null にする以外に何かする必要がありますか?
3) ページに保存されている配列のリストが巨大で、GC によって収集されていない DOM 要素への参照が含まれていることにも気付きました。JavaScript から配列を消去し、すべての要素を削除対象としてマークできるようにするための文書化されたベスト プラクティスはありますか? (注: これは、メモリ リークの原因として現在最も疑わしいものです)