Подтвердить что ты не робот

Почему IE теряет память при упаковке ответа HTML в объекте jQuery?

Я пытаюсь понять, почему IE утечка памяти при упаковке AJAX-ly запрошенной HTML-страницы в объекте jQuery для обработки. Пользователь может посещать страницу и позволять ей сидеть в течение нескольких минут или часов, поэтому страница использует метод jQuery ajax несколько раз в минуту для получения новых данных, а затем я заменяю важные части страницы на новую предварительно визуализированную данных.

В этот момент я сузил его до одного вызова - когда $(data) вызывается для обертывания строки HTML, память немного падает и никогда не кажется собранной в мусор. Со временем используется много сотен МБ, и я вынужден перезагрузить страницу или перезапустить IE.

Этот скрипт способен воспроизвести проблему. Он использует AJAX для запроса страницы, а затем вызывает $(data) в узком цикле, чтобы преувеличить утечку. Chrome и Firefox, похоже, реагируют так, как я ожидал (память исправлена), но IE ведет себя плохо. Удивление.

Используя Process Explorer, я вижу всплеск потребления памяти резко после запуска вышеупомянутой скрипки всего два раза.

enter image description here

В настоящее время я использую IE9 в стандартном режиме.

Почему это происходит? Есть ли способ обхода?

Update

Здесь скрипт, который демонстрирует проблему без использования AJAX.

4b9b3361

Ответ 1

Я нашел обходной путь проблемы, описанной выше.

При устранении неполадок я попробовал множество вещей, чтобы предотвратить утечку. Решение, с которым я столкнулся, состояло в том, чтобы с помощью $.ajax извлечь данные и $(), чтобы обернуть результаты. Вместо этого я использовал $('#destination').load('sourceUrl #selector') (см. documentation), чтобы перетащить данные в скрытый div и затем обработать результат таким образом.

Выключается $.load использует $.parseHTML под обложками, чтобы манипулировать результатами и вставлять их в указанное место (и $(), по-видимому, нет). Смотрите здесь для исходной строки.

  • $(htmlText) утечки
  • $(bodyText) не течет
  • $.parseHtml(htmlText) медленно течет (?)
  • $.parseHtml(bodyText) не течет

Здесь fiddle, чтобы продемонстрировать.

Я не знаю, почему он ведет себя так, как это делается, но, по-видимому, это не так: избегайте синтаксического анализа полных HTML-документов по возможности.

Ответ 2

Я видел, что вы видели, когда я изменил код для перераспределения функции каждый раз, когда был вызван успех, магически он не просачивался (по крайней мере, в моей среде.)

Итак, мое решение глупо, но, похоже, оно работает для меня. Он работает для вас?

$(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/