Здесь мертво-простая веб-страница, которая утечки памяти в IE8 с использованием jQuery (я обнаруживаю утечки памяти, наблюдая за использованием памяти моего процесса iexplore.exe со временем в диспетчере задач Windows):
<html>
<head>
<title>Test Page</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<script type="text/javascript">
function resetContent() {
$("#content div").remove();
for(var i=0; i<10000; i++) {
$("#content").append("<div>Hello World!</div>");
}
setTimeout(resetTable, 2000);
}
$(resetContent);
</script>
<div id="content"></div>
</body>
</html>
По-видимому, даже при вызове функции jQuery.remove()
я все еще испытываю утечку памяти. Я могу написать свою собственную функцию удаления, которая не испытывает утечки памяти следующим образом:
$.fn.removeWithoutLeaking = function() {
this.each(function(i,e){
if( e.parentNode )
e.parentNode.removeChild(e);
});
};
Это прекрасно работает и не утечка памяти. Итак, почему происходит утечка памяти jQuery? Я создал другую функцию удаления, основанную на jQuery.remove()
, и это действительно вызывает утечку:
$.fn.removeWithLeakage = function() {
this.each(function(i,e) {
$("*", e).add([e]).each(function(){
$.event.remove(this);
$.removeData(this);
});
if (e.parentNode)
e.parentNode.removeChild(e);
});
};
Интересно, что утечка памяти, по-видимому, вызвана каждым вызовом, который включает jQuery, чтобы предотвратить утечку памяти из событий и данных, связанных с удаляемыми элементами DOM. Когда я вызываю функцию removeWithoutLeaking
, тогда моя память остается постоянной с течением времени, но когда я вызываю removeWithLeakage
вместо этого, она просто продолжает расти.
Мой вопрос: как насчет того, что каждый вызов
$("*", e).add([e]).each(function(){
$.event.remove(this);
$.removeData(this);
});
может вызвать утечку памяти?
EDIT: исправлена опечатка в коде, которая после повторного тестирования оказалась неэффективной для результатов.
ДАЛЬНЕЙШЕЕ ИЗМЕНИТЬ: я написал отчет об ошибке с проектом jQuery, так как это похоже на ошибку jQuery: http://dev.jquery.com/ticket/5285