7

Microsoft の IE6 および IE7 ブラウザでは、特定の Javascript コード パターンが使用されている場合にメモリ リークが発生します。IE6 の初期にさかのぼって、リーク パターンが何であったかについて多くの情報を見つけました。ただし、これらの多く (すべてではない) が IE7 および IE6 のサービス パックで修正されたことを理解しています。IE6 および IE7 のこれらのパッチが適用されたバージョンにまだ残っているリークについて、信頼できる情報源を見つけることができません。

リーク パターンを検出するためのツールがいくつかあります。でも思い通りには使えないみたい!

  • Microsoft の (V2) メモリ リーク検出器は、リークすべきパターンを使用している場合でも、コード内のリークをまったく検出しません。これは、私が IE8 を実行していることが原因である可能性があります。IE6 または IE7 のふりをさせる、頭痛の種ではない方法はありますか?

  • ドリップとふるいは、「孤立した」種類のリークを大量に見つけているようです。確かに、これらは誤検知であるに違いありません。事実上、ドキュメントに追加してから再度削除するすべての要素がリストされており、それらへの参照を保持しているとは思えません。また、それらが本物である場合、コード内のどこでリークしているのかをどのように見つけることができますか? ツールには、何も表示されない「プロパティ」機能があり、壊れているように見えます。繰り返しますが、これらのリークが IE6 または IE7 に関連しているのか、それとも私がインストールした IE のバージョンである IE8 に関連しているのかはわかりません。

そのため、パッチを適用した IE6 および IE7 のバージョンで依然として問題となっているメモリ リークの種類と、ツールを使用してライブ コードでそれらを効果的に見つける方法を知りたいと思います。

何か助けはありますか?

4

1 に答える 1

2

メモリリークを検出するための効果的なツールはないと思います。ただし、PCでIE6-7-8をエミュレートするために使用できるソフトウェアがあります。これはIEテスターと呼ばれます。

Internet Explorerで発生した最も一般的なリークは、JScriptとの相互作用です。

DOMオブジェクトにJavaScriptオブジェクト(イベント処理関数など)への参照が含まれている場合、およびそのJavaScriptオブジェクトにそのDOMオブジェクトへの参照が含まれている場合、循環構造が形成されます。 -http ://javascript.crockford.com/memory/leak.html

この循環構造は、IEが対処するのに苦労しているものです。循環参照がどのように形成されるかを理解する必要があります(クロージャーを介して)。最初のステップは、DOM要素を削除する前にそれらをクリーンアップすることです。

これは、次のような一般的な関数で実行できます。

function purge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            purge(d.childNodes[i]);
        }
    }
}

DOMから要素を削除するたびpurgeに、最初にDOMで使用する必要があります。そのためのラッパーを書くこともできます

function safeRemove(el) {
  purge(el);
  el.parentNode.removeChild(el);
}

もちろん、これは他の場所(DOM2イベントハンドラーなど、クロージャーを介した他の場所)での参照には役立たないため、単なる出発点です。要素を削除する場所を確認し、どの関数がそれらを参照しているかを確認する必要があります。

この問題は、IE6-7-8でもまだ存在しているようです。

于 2010-11-17T09:10:40.683 に答える