2010-05-03 2 views
2

В одной статье я видел, что может быть хорошо очистить все expandos от события window.unload, чтобы предотвратить утечку памяти.Должен ли я очищать пользовательские свойства (Expandos) при событии window.onunload?

Я не могу понять, зачем это делать.

Разве браузер не очищает все DOM и его соответствующие ресурсы после того, как вы покинули страницу в любом случае?

Спасибо,

Бурак Özdogan

ответ

1

Эй, большой вопрос. Проблема связана с циклическими ссылками между объектами JavaScript и узлами DOM.

Предположим, у вас есть глобальный объект JavaScript, который указывает на узел DOM, и узел имеет свойство expando обратно к объекту. Когда страница выгружается, механизм сценария «обнуляет» объект JavaScript, поэтому он больше не указывает на узел DOM. Но он не может освободить объект из памяти, потому что все еще есть ссылка на него (из DOM). Затем движок сценария завершается.

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

Итак, проблема в том, что DOM только заботится о принадлежащей ему памяти и предполагает, что движок сценария сделает то же самое.

Надеюсь, это помогло.

См: http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+0

спасибо за чистое объяснение. Мне еще не ясно, когда страница выгружается, почему DOM все еще там. Я имею в виду, если после разгрузки нет страницы, о которой следует говорить, почему браузер все еще сохраняет DOM этой страницы в памяти? – pencilCake

+0

DOM существует как совокупность объектов в куче памяти процесса браузера. Это не похоже на DOM - это единый объект, который браузер может просто выбросить. (Исключение составляют браузеры, которые порождают отдельный процесс для каждой вкладки. В этих случаях браузер может очистить все, убив процесс и позволяя ОС восстановить память.) В любом случае, когда страница выгружает «DOM», ушел, но куски его могут остаться из-за круговых ссылок. Дело не в том, что браузер хочет оставить их, он просто не может их очистить, потому что он считает, что есть ссылки на них. –

+0

Я думаю, что это относится только к IE из-за того, как он делает сборку мусора (т. Е. Подсчет ссылок вместо отметки и прокрутки), правильно? –

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