6

私のアプリでは、Win7 の IE プロセスに関連するメモリが、ページを更新するたびに 20 ~ 30 MB 増加していることに気付きました。約 1.5 GB に達すると、ブラウザーが応答しなくなります。私はIE9を使用していますが、これはIE9でしか再現できません。Chrome、FF、IE7、または IE8 ではこのような問題はありません。実際、互換モードで IE9 を実行しても問題は発生しません。

特に、ページを更新した後でもメモリがリークする可能性があるのは不思議です。他の誰かがこれを見たことがありますか?

4

2 に答える 2

6

これがあなたの問題かどうかはわかりませんが、メモリがどんどん増え続けるIE9メモリリークの問題も発生していました(更新/ページ変更ごとに約20mg)。

Modernizr を使用している場合 (これは 2.5 以降の非常に最近のリリースで修正されているはずです)、古いバージョンを使用している場合 (何らかの理由で更新できない場合) は、 do は、1 つのreturnステートメントを置き換えます。

この問題はModernizr / Geolocation & IE9で発生しています。実際には、Modernizr ではなく IE9 の継承の問題です。

return 'geolocation' in navigator

それ以外の:

return !!navigator.geolocation // this causes the memory leak (silly IE9)

https://github.com/Modernizr/Modernizr/issues/513

そのリンクを見てください。ただし、基本的に Geolocation テストの return ステートメントを変更する必要があり、この問題は自動的に修正されます!

于 2012-10-16T16:25:14.583 に答える
3

これまで、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 個の循環参照オブジェクトを割り当てているわけではありませんが、まだ見つけていない循環参照を含む大きなオブジェクトを作成している可能性があります。

于 2012-05-15T18:15:39.457 に答える