23

JavaScript でメモリ リークが発生する原因を知っていますか? ブラウザに興味があります: IE 7、FireFox 3、Safari 3

4

5 に答える 5

34

JavaScript とメモリ リークに関する素晴らしい記事があります。ブラウザに特化したものではなく、メモリリークと JavaScript の問題全体について説明しています。

一般向けのウェブサイトを開発する場合、少数のブラウザ向けに最適化するのではなく、可能な限りブラウザを特定しない方が良いアプローチだと思います。

于 2008-10-04T14:41:15.787 に答える
22

これは 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;
于 2008-10-04T14:43:34.440 に答える
3

一般に; 循環参照は多くの問題の原因です。IE 6(7に当てはまるかどうかはわかりません)がXMLHTTPでかなりひどくリークしたことを覚えています...onreadystatechange = nullを設定すると、終了したら修正されました。

于 2008-10-04T14:30:04.297 に答える
2

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/

于 2008-10-04T15:01:59.287 に答える
1

Internet Explorer のメモリ リーク パターンについては、このMSDN の記事を参照してください。また、メモリ リークを検出するためのツールがいくつかあります。

于 2008-10-04T14:48:53.197 に答える