22

Вопрос по memory-management, garbage-collection, javascript – Подводные камни управления памятью Javascript?

Я знаю, что в Javascript есть сборщик мусора. Поэтому, используяудалять удалить только ссылку на объект, и когда больше нет ссылки на этот объект, он удаляется GC.

Javascript сложен, с замыканиями, нечетким пространством имен и наследованием прототипа, это 'Не всегда очевидно знать, когда и почему.

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

  • Так, когда я должен использоватьудалять ?
  • Какие ловушки я должен избегать, используя объекты?
  • Что-то знать о замыканиях?
  • Некоторые хорошие практики, чтобы выделить?

<span>Есть ли опечатка, где у вас есть<code>to know when to **now** or why</code>? Я могу&#39;разобрать этот кусочек английского ...</span>

Jan 04, 2013, 9:42 PMотhippietrail

<span>Я не понимаю меня сам. Может быть, я был пьян или просто проснулся, когда написал это. Или оба. Просто не обращай внимания.</span>

Jan 06, 2013, 10:32 PMотe-satis

3ответа

3

Я думаю, что, сохраняя данные на узлах DOM, вы можете легко создавать циклические ссылки, с которыми могут справиться не все браузеры. Например:

this.element = document.getElementById('something');
this.element.attachedObject = this;
10

По моему опыту сборщики мусора хорошо / плохо реализованы в зависимости от браузера. Применение хороших методов объектно-ориентированного программирования - хорошее начало.

Мой единственный совет:не создавайте утечки памяти при подключении DOM & объекты JavaScript (циркулярные ссылки, которые выигралидолжны быть очищены GC DOM и JS). Эти ошибки будут поглощать гораздо больше памяти, чем любой объект, который вы создадите в приложении.

Подробнее о утечках памяти в DOM / JS.http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

5

  • В IE, по крайней мере в более старых версиях, элемент DOM сохранялся в памяти после того, как вы удалили его с помощью removeChild, если к нему подключен прослушиватель событий. Единственный способ удалить его из памяти - отсоединить событие перед удалением из DOM.
  • Пока ты нене создавать и удалять элементы часто, вы недействительно надо об этом беспокоиться. Если вы создаете много элементов при запуске приложения, но непосле этого создавать новые объектыне слишком беспокоиться об утечках памяти.

RelatedQuestions