jQuery.remove (), отсоединяю элементы DOM, но я все еще могу получить доступ к элементам из кода.Как избежать утечек? - PullRequest
9 голосов
/ 04 ноября 2011

Я знаю, что нелегко правильно управлять памятью внутри приложения с большим количеством элементов пользовательского интерфейса и полностью на основе Ajax (в моем приложении страницы никогда не перезагружаются). Но я хотел бы понять следующее поведение:

У меня есть корневой элемент, к которому одновременно должен быть присоединен один дочерний элемент (он рассматривается как корневой элемент, являющийся контейнером приложения, а дочерние элементы - отдельными страницами). Всякий раз, когда я переключаюсь между дочерним содержимым, я удаляю предыдущее содержимое с помощью jQuery.remove (), но вижу, что содержимое фактически отделено от DOM, но остается в памяти.

  1. корень и два дочерних содержимого (child1 и child2)
  2. с child1 Я переключаю на child2, прося, чтобы мой менеджер приложений удалил child1 перед присоединением child2
  3. child2 присоединяется (я вижу это), но я все еще могу использовать элементы child1 из кода, который управляет child1

код child1 (который содержит ссылки на DOM child1):

function testaccess(){
   load_and_remove(child2);
   var child1DOM = get_this_dom();
}

child1DOM все еще там, и я могу манипулировать им, как если бы он все еще был подключен к DOM.

Хорошо, я полагаю, что jQuery.remove () и GC не смогут освободить память, пока у меня не будет кода, который получит к нему доступ, но даже если я не вызову get_this_dom (), даже после выхода из testaccess ( ), Я вижу, что память FF не уменьшается ...

Интересно, как заставить GC освободить всю память, когда я выхожу из child1.

1 Ответ

6 голосов
/ 04 ноября 2011

Он не будет удален из DOM, пока не будут освобождены все ссылки на него.

Вы должны попытаться удалить все циклические ссылки между JS DOM и DOM рендеринга - они оба имеют отдельные сборщики мусора и работают по отдельности.,Следовательно, почему JS сборщик мусора и метки не перехватывает их.

Вы можете попытаться переработать код, чтобы разорвать циклическую ссылку:

var mything = something();
mything = null;

Вот пара статей, которые могутhelp:

http://msdn.microsoft.com/en-us/library/Bb250448

http://www.javascriptkit.com/javatutors/closuresleak/index.shtml

http://javascript.info/tutorial/memory-leaks

Я почти уверен, что вы можете найти некоторые довольно быстро по этому поводу.

Кроме того, вы можете попробовать .empty(), чтобы освободить все дочерние узлы, но он вызывает .remove (), чтобы выполнить небольшую работу.

Обратите внимание, что некоторые из этих проблем были исправлены в более новыхверсии jQuery, то есть, например, 1.5 лучше, чем 1.4.

Еще один пост на SO: Утечка памяти в jQuery с удалением DOM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...