11

AJAX で要求された HTML ページを処理のために jQuery オブジェクトにラップするときに、IE がメモリ リークを起こしている理由を突き止めようとしています。ユーザーがページにアクセスして何分または何時間も放置する場合があるため、ページは jQuery のajaxメソッドを 1 分間に数回使用して新しいデータを取得し、ページの重要な部分を新しい事前レンダリングされたデータに置き換えます。

この時点で、1 回の呼び出しに絞り込みまし$(data)た。HTML 文字列をラップするために が呼び出されると、メモリが少し急増し、ガベージ コレクションが行われることはありません。時間の経過とともに数百 MB が使用され、ページをリロードするか、IE を再起動する必要があります。

このフィドルは問題を再現できます。AJAX を使用してページを要求し$(data)、リークを誇張するためにタイトなループを呼び出します。Chrome と Firefox はどちらも期待どおりに反応しているように見えます (メモリが再利用されます) が、IE の動作はよくありません。サプライズ。

Process Explorer を使用すると、上記のフィドルを 2 回実行しただけで、メモリ消費量が劇的に急増することがわかります。

ここに画像の説明を入力

現在、IE9 を標準モードで使用しています。

なぜこうなった?回避策はありますか?

アップデート

これは、AJAX を使用せずに問題を示すフィドルです。

4

2 に答える 2

3

上記の問題の回避策を見つけました。

このトラブルシューティングでは、リークが発生しないようにさまざまなことを試みました。私が思いついた解決策は$.ajax、データを取得し$()て結果をラップするために使用することをやめることでした。代わりに、$('#destination').load('sourceUrl #selector')ドキュメントを参照)を使用してデータを非表示のdivに押し込み、その方法で結果を操作しました。

結果を操作し、指定された場所にそれらを押し込むためのカバーの下での$.load使用が判明しました(そして明らかにそうではありません)。ソース行については、こちらを参照してください。$.parseHTML$()

  • $(htmlText)リーク
  • $(bodyText)漏れない
  • $.parseHtml(htmlText)ゆっくりと漏れる(?)
  • $.parseHtml(bodyText)漏れない

これがデモンストレーションするフィドルです。

なぜそれがそのように動作するのかはわかりませんが、それが不足しているようです。可能な限り、完全なHTMLドキュメントを解析することは避けてください。

于 2013-03-18T17:56:33.997 に答える
0

成功が呼び出されるたびに関数を再割り当てするようにコードを変更したとき、魔法のようにリークしませんでした(少なくとも私の環境では)。

したがって、私の解決策はばかげていますが、うまくいくようです。それはあなたのために働きますか?

$(function(){
    $.ajaxSetup({ cache: false });

    $('#go').click(performCall);
});

function performCall() {
    $('#timestamp').text('Working...');

    $.ajax({
       url: 'http://fiddle.jshell.net/',
        success: function(){
            var func = function(data, textStatus, jqXHR) {
                $('#timestamp').text('Done at ' + new Date());
                for(var x = 0; x < 100; x++) {
                    var $a = $(data);
                }
            };
            func();
        }
   });
}

http://jsfiddle.net/tCvUw/

于 2013-03-14T18:44:32.193 に答える