Обновление DOM через Javascript вызывает утечки памяти (только в Firefox?) - PullRequest
5 голосов
/ 25 июня 2011

Я знаю, что этот вопрос задавался ранее, но, похоже, ни один из ответов не решил проблему.Я тестирую веб-страницу AJAX, которая обновляет элементы в DOM через javascript.

Каждую минуту сервер запрашивает новые данные, и DOM соответствующим образом обновляется.Из того, что я могу сказать, использование памяти для этой страницы в Chrome растет, но не слишком сильно (оно начинается около 40 МБ и достигает, может быть, максимум 80 МБ).Однако в Firefox использование памяти начинается с 120 МБ и может быть увеличено до 400 МБ.Я прошел через Javascript с помощью Firebug, и кажется, что память увеличивается больше всего, когда DOM обновляется с помощью моих методов Javascript.

Манипуляция DOM проста, например:

var myTable = document.createElement("table");

var thead = document.createElement("thead");
var tr = document.createElement("tr");
var th = document.createElement("th");
th.appendChild(document.createTextNode("column1"));
tr.appendChild(th);

for(var test in obj.testObjs){
    th = document.createElement("th");
    th.appendChild(document.createTextNode(obj.testObjs[test].myVar));
    tr.appendChild(th);
}

Прежде чем добавлять новые данные к узлам в DOM, я сначала очищаю существующие данные.Я пробовал несколько способов, в том числе то, что описано здесь: Как удалить элементы DOM без утечек памяти?

А также простой способ, такой как:

function clearChildren(node){
    if(node != null){
        while (node.hasChildNodes()) node.removeChild(node.firstChild);
    }
}

Я также читал ( Циклическое добавление / удаление DOM-узлов вызывает утечки памяти в JavaScript? ), что браузеры только начинают собирать мусор, когда он достигает определенного уровня?Можно ли это подтвердить?Я чувствую, что из-за растущей памяти мой компьютер через некоторое время работает медленноиспользование памяти будет расти.

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Можно ли это подтвердить?

Это зависит.

Как правило, браузеры получают GC, когда им это нравится, и эвристика может меняться довольно часто. Я подозреваю, что если вы попробуете Firefox по ночам, вы увидите поведение, совершенно отличное от описанного выше. Со времени выхода Firefox 5 произошло как минимум 2 эвристических изменения GC.

2 голосов
/ 26 июня 2011
innerHTML=''

Неправильный способ подготовить переменную для обработки GC.
Вам необходимо использовать функцию delete для элемента и каждого элемента, на который этот элемент ссылается.
Aмного, верно?
Вот почему у нас есть библиотеки JS, где это было написано для нас.Я проверил код в Mootools (скачайте его и найдите destroy ), и мне кажется, что он написан правильно.
Полагаю, он будет таким же и в других библиотеках.

...