JavaScript でメモリ リークが発生する原因を知っていますか? ブラウザに興味があります: IE 7、FireFox 3、Safari 3
5 に答える
JavaScript とメモリ リークに関する素晴らしい記事があります。ブラウザに特化したものではなく、メモリリークと JavaScript の問題全体について説明しています。
一般向けのウェブサイトを開発する場合、少数のブラウザ向けに最適化するのではなく、可能な限りブラウザを特定しない方が良いアプローチだと思います。
これは IE の古典的なメモリ リークです:-
function body_onload()
{
var elem = document.getElementById('someElementId');
// do stuff with elem
elem.onclick = function() {
//Some code that doesn't need the elem variable
}
}
このコードが実行された後、要素への参照を保持するスコープ オブジェクトを参照する onclick イベントが要素に割り当てられているため、循環参照が発生します。
someElement->onclick->function-scope->elem->someElement
IE DOM 要素は、Javascript GC がクリーンアップできない COM ベースの参照カウント オブジェクトです。
上記のコードに最後の行を追加すると、それがクリーンアップされます:-
var elem = null;
一般に; 循環参照は多くの問題の原因です。IE 6(7に当てはまるかどうかはわかりません)がXMLHTTPでかなりひどくリークしたことを覚えています...onreadystatechange = nullを設定すると、終了したら修正されました。
2 種類のオブジェクト (および 2 つのガベージ コレクター)、javascript および DOM オブジェクトを扱っています。これらは相互に参照できます (循環参照)。ページがアンロードされても、どちらの GC もすべてのオブジェクトを処理できません。ここに良い説明があります:
http://getben.com/archive/2006/05/30/Resolving-JavaScript-Memory-Leaks.aspx
http://www.josh-davis.org/2007/04/11/javascript-built-in-listeners-and-memory-leaks/
Internet Explorer のメモリ リーク パターンについては、このMSDN の記事を参照してください。また、メモリ リークを検出するためのツールがいくつかあります。