2010-09-02 2 views
2

я задавался вопросом, если следующий код будет вызывать некоторые проблемы, такие как утечка памятимусор jquery.html

<html> 
<head> 
    <script type='text/javascript' src='jquery-1.4.2.js'> </script> 
    <script type="text/javascript"> 
     function a(){ 
      for(var i = 0; i < 50000; i++){ 
       $("#d").html("<span>" + i + "</span>"); 
      } 
     } 

    </script> 
</head> 
<body onload='a();'> 
    <div id="d"></div> 
</body> 

ответ

3

Простой промежуток создается здесь на каждой итерации. Функция html() в jQuery запускает внутреннюю функцию cleanData, которая удаляет связанные данные и события из всех содержащихся узлов, что в любом случае не так.

Затем jQuery устанавливает свойство innerHTML переданному в строке, которое освобождает существующие элементы. Это зависит от сборщика мусора браузера, чтобы восстановить эту память, когда это возможно. В этом коде вообще нет утечек. Chrome действительно очень быстро выпускает эту память. Я вижу падение с 2.421MB до 748KB в основном из элементов диапазона, выпущенных менее чем за 3 секунды.

Он не дожидается, когда страница выгрузится, чтобы освободить эту память. Эти три моментальных снимка были отстоят друг от друга менее чем за секунду, в течение которых из памяти было выпущено почти 26000 HTMLElement объектов.

Перед открытием страницы

alt text

После открытия страницы (23000 объекты HTMLElement уже освобождены немедленно, около 27000 были остальные)

alt text

Менее чем через секунду позже (все 27000 объектов, кроме 1 были выпущены)

alt text

+0

Вы смешиваете динамическую память, используемую во время работы сценария, с общей памятью, используемой страницей. Chrome не освобождает всю память страницы, пока страница не будет закрыта. На самом деле Chrome не улучшил память, а Firefox сделал это. –

+0

@Brock - Это не имеет никакого смысла. Я думаю, вы имеете в виду пиковое использование, которое в один момент времени имело 50000 выделенных объектов. Однако это было очень коротко. V8 немедленно начал выпускать неиспользуемые объекты. О, и gc не дожидается, когда страница выгрузится, чтобы вернуть эту память. – Anurag

+0

(1) Измерьте используемую память. Теперь (2) откройте вкладку для кода. Память будет увеличиваться и через несколько секунд уменьшится до нового значения на несколько мегабайт выше, чем шаг 1. Это новое использование памяти будет абсолютно ** не возвращаться, пока страница не будет выгружена. –

1

Это будет использование памяти (возможно, порядка мегабайта или 2), но это не пропустит его.

Когда страница закрыта, память должна быть восстановлена.

Мои результаты на Грязный экземпляра Firefox:

     Memory used (allow several seconds to settle) 
         ----------------------------------------------- 
Before opening page:  163,332K 
Open and page finished:  164,932K (temporarily spiked to about 210M) 
After page closed:   163,668K 

Обратите внимание, что небольшая разница может быть один из многих других открытых вкладок, или это может быть утечка памяти, что Firefox славится, но возможно, нет этот JS код.

Смежные вопросы