Подтвердить что ты не робот

Ошибки управления памятью Javascript?

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

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

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

  • Итак, когда я должен использовать delete?
  • Каковы ловушки, которых я должен избегать, используя объекты?
  • Некоторые сведения о закрытии?
  • Некоторые хорошие практики для выделения?
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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