Я создал веб-страницу, которая делает вызов Ajax каждую секунду. В Internet Explorer 7 он плохо теряет память (20 МБ за 15 минут).Простой jQuery Ajax вызов утечки памяти в Internet Explorer
Программа очень проста. Он просто запускает функцию JavaScript, которая вызывает вызов Ajax. Сервер возвращает пустую строку, а код JavaScript ничего не делает с ней. Я использую setTimeout
для запуска функции каждую секунду, и я использую Drip, чтобы посмотреть эту вещь.
Вот источник:
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout('testJunk()',1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){}
});
setTimeout('testJunk()',1000)
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
Как подключить эту утечку? У меня есть реальное приложение, которое таким образом обновляет большую таблицу, но, оставив без присмотра, она будет потреблять гигабайты памяти.
Edit: хорошо, так что после некоторых хороших предложений, я изменил код:
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout(testJunk,1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){setTimeout(testJunk,1000)}
});
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
Это не кажется, никакой разницы, хотя. Я ничего не делаю с DOM, и если я прокомментирую вызов Ajax, утечка памяти прекратится. Таким образом, похоже, что утечка полностью связана с вызовом Ajax. Является ли jQuery Ajax по своей сути созданием своего рода циркулярной ссылки, и если да, то как я могу ее освободить? Кстати, это не утечка в Firefox.
Кто-то предложил запустить тест в другой виртуальной машине и посмотреть, будут ли результаты одинаковыми. Вместо того, чтобы настраивать другую виртуальную машину, я обнаружил, что на ноутбуке работает XP Home с Internet Explorer 8. Он обнаружил ту же проблему.
Я попробовал несколько старых версий jQuery и получил лучшие результаты, но проблема не исчезла полностью, пока я не оставил Ajax в jQuery и пошел с более традиционным (и уродливым) Ajax.
Также очень любопытного об ответе - У меня есть идеи, но хочу знать результаты. – Plynx
Хороший вопрос, я не знаю ответа, но вы можете подумать о том, что setTimeout используется в функции успеха, чтобы вы не перегружали сервер, если начинаете делать запросы, требующие времени. Если вы не получили весь ответ с сервера перед отправкой следующего запроса, вы откроете новое соединение. – MyGGaN
Спасибо за предложение о перемещении setTimeout. Я попробовал, но это не помогло. –