3

IE 6 でメモリ リークの問題が発生している巨大な Web アプリがあります。

問題を示す 5 行のコード サンプルでメモリ リークを修正するのは簡単です。

しかし、非常に巨大なアプリケーションがある場合、どこから始めるべきでしょうか?

4

3 に答える 3

7

ドリップをチェックしてください。これにより、通常、IE のメモリ リークから当て推量が取り除かれます。

何らかの理由で Drip がそれを見つけられない場合は、イベントで動作する JavaScript コードを詳しく調べてください。これは、ほとんどの場合、ブラウザで重大なメモリ リークが発生する原因です。

最初にそれらのハンドラーを削除せずに、ハンドラーがアタッチされた DOM 要素を破棄すると、それらのハンドラーに関連付けられたメモリが回復されなくなります。

于 2008-08-21T12:59:03.173 に答える
1

アプリケーションは多くの JavaScript を使用していますか?

その場合、メモリ リークを回避するのに役立つことがわかった 1 つのことは、Prototype や jQuery などの JavaScript フレームワークを使用していることを確認することです。これらは、メモリ リークしないイベント処理コードを試してテストしたからです。

于 2008-08-21T13:03:17.640 に答える
0

IE7 のメモリ リーク問題を解決した方法を次に示します。アイデアは、ページのアンロード時にすべての DOM ノードのすべての expando プロパティを破棄/null に設定することです。これは私にとってはうまくいきました。役に立つかもしれません。

<!--[if lt IE 8]>
<script type="text/javascript">

function disposeAll() {
    if (window.document.all) {
        for (var index = 0; index < window.document.all.length; index++) {
            try { dispose(window.document.all[index], []); } catch (e) { debugger; }
        }
    }
    dispose(window.document.body, []);
    dispose(window.document, []);
    dispose(window, []);
    window.disposeAll = null;
    window.dispose = null;
    window.onunload = null;
}

function dispose(something, map) {
    if (something == null) return;
    if (something.dispose && typeof (something.dispose) == 'function') {
        try { something.dispose(); } catch (e) { debugger; }
    }
    map.push(something);
    for (var key in something) {
        var value = null;
        try { value = something[key]; } catch (e) { };
        if (value == null || value == dispose || value == disposeAll) continue;

        var processed = null;
        for (var index = 0; index < map.length; index++) {
            if (map[index] === value) {
                processed = value;
                break;
            }
        }
        if (processed != null) continue;
        var constructor = value.constructor;
        if (constructor == Object || constructor == Array) {
            try { dispose(value, map); } catch (e) { debugger; }
        }
        if (constructor == Object || constructor == Array || constructor == Function) {
            try { something[key] = null; } catch (e) { debugger; }
        }
    }
    map.pop();
}

(function() {
    var previousUnloadHandler = window.onunload;
    if (previousUnloadHandler == null) {
        window.onunload = disposeAll;
    } else {
        window.onunload = function() {
            previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED
            disposeAll();
            previousUnloadHandler = null;
        };
    }
}());

</script>
<![endif]-->

すべての「debugger;」を削除したい場合があります。時折の例外を処理したくない場合は、ステートメントを使用してください。

于 2012-03-01T16:27:02.307 に答える