Почему 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.
Ответы
Ответ 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/