これまで、Internet Explorer では、通常の JavaScript 変数と DOM オブジェクトの間の参照に関していくつかの問題がありました。したがって、私の記憶が正しければ、このような循環参照
var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
e
およびへの他の参照がなくても、ガベージ コレクションは行われませんx
。これは、IE が DOM 要素と JavaScript に対して異なる方法のガベージ コレクションを使用したためです。
現在、この問題は上位バージョンの IE で既に修正されていると信じていましたが、そうではなかったのかもしれません。そのような問題のある参照をすべて見つけて、不要になった場合は手動で削除してください。
e.jsReference = null;
x.elementReference = null;
編集:IE 8でテスト
この簡単なテスト Web ページを書きました。
<html>
<head>
<title>Leak test</title>
<script>
function leak() {
var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
}
function test() {
for (var i = 0; i < 10000; i++)
leak();
alert('Done');
}
</script>
</head>
<body>
<input type="button" value="test" onclick="test();" />
</body>
</html>
このマシンには IE 9 がインストールされていないため、IE 8 でこれをテストしました。ただし、IE のごく最近のバージョンでも問題が存在し、IE 9 でも問題が解決しない可能性があることを示しているため、これは依然として関連している可能性があります。
ページを開いてメモリ使用量を見ました。ボタンを押すたびに、メモリ使用量が数 MB 増加しました。ウェブページを更新した後、まったく何も起こりませんでした。IE を閉じた後、メモリ使用量は元の状態に戻りました。
IE 9 で試してみてください。もちろん、コード内で 10000 個の循環参照オブジェクトを割り当てているわけではありませんが、まだ見つけていない循環参照を含む大きなオブジェクトを作成している可能性があります。