Я создал веб-страницу, которая делает вызов Ajax каждую секунду. В Internet Explorer 7 происходит сильная утечка памяти (около 20 МБ за 15 минут).
Программа очень проста. Он просто запускает функцию 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>
Как устранить эту утечку? У меня есть реальное приложение, которое обновляет большую таблицу таким образом, но если оставить ее без присмотра, она потребляет гигабайты памяти.
Редактировать : хорошо, поэтому после некоторых хороших предложений я изменил код на:
<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.