Ошибки управления памятью Javascript?
Я знаю, что у Javascript есть сборщик мусора. Поэтому, используя delete, удаляйте только ссылку на объект, а когда больше нет ссылки на этот объект, он удаляется GC.
Javascript сложен, с закрытием, нечетким пространством имен и наследованием прототипа, не всегда очевидно знать, когда сейчас или почему.
Я кодирую довольно большой проект Javascript и хотел бы избежать утечки памяти, одновременно ограничивая использование глобальной памяти. Я вовсе не на этапе оптимизации (пусть сначала начнет работать материал:-)), но было бы неплохо узнать о хороших практиках управления памятью, чтобы избежать написания дрянного кода.
- Итак, когда я должен использовать delete?
- Каковы ловушки, которых я должен избегать,
используя объекты?
- Некоторые сведения о закрытии?
- Некоторые хорошие практики для выделения?
Ответы
Ответ 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;