Простой промежуток создается здесь на каждой итерации. Функция html()
в jQuery запускает внутреннюю функцию cleanData
, которая удаляет связанные данные и события из всех содержащихся узлов, что в любом случае не так.
Затем jQuery устанавливает свойство innerHTML переданному в строке, которое освобождает существующие элементы. Это зависит от сборщика мусора браузера, чтобы восстановить эту память, когда это возможно. В этом коде вообще нет утечек. Chrome действительно очень быстро выпускает эту память. Я вижу падение с 2.421MB до 748KB в основном из элементов диапазона, выпущенных менее чем за 3 секунды.
Он не дожидается, когда страница выгрузится, чтобы освободить эту память. Эти три моментальных снимка были отстоят друг от друга менее чем за секунду, в течение которых из памяти было выпущено почти 26000 HTMLElement
объектов.
Перед открытием страницы
После открытия страницы (23000 объекты HTMLElement уже освобождены немедленно, около 27000 были остальные)
Менее чем через секунду позже (все 27000 объектов, кроме 1 были выпущены)
Вы смешиваете динамическую память, используемую во время работы сценария, с общей памятью, используемой страницей. Chrome не освобождает всю память страницы, пока страница не будет закрыта. На самом деле Chrome не улучшил память, а Firefox сделал это. –
@Brock - Это не имеет никакого смысла. Я думаю, вы имеете в виду пиковое использование, которое в один момент времени имело 50000 выделенных объектов. Однако это было очень коротко. V8 немедленно начал выпускать неиспользуемые объекты. О, и gc не дожидается, когда страница выгрузится, чтобы вернуть эту память. – Anurag
(1) Измерьте используемую память. Теперь (2) откройте вкладку для кода. Память будет увеличиваться и через несколько секунд уменьшится до нового значения на несколько мегабайт выше, чем шаг 1. Это новое использование памяти будет абсолютно ** не возвращаться, пока страница не будет выгружена. –