В этой главе мы рассмотрим, как JavaScript управляет своей памятью. JavaScript - уникальный язык, он способен автоматически выделять память при создании объектов и освобождать ее, когда они больше не используются. В отличие от низкоуровневых языков, которые требуют ручного определения того, в какой момент программы выделенная память больше не нужна и ее нужно освободить. Итак, давайте посмотрим, что происходит в высокоуровневом языке, таком как JavaScript, когда вам больше ничего не нужно. Как JavaScript движок это обнаруживает и очищает.
Основная Концепция
Достижимость - это основная концепция управления памятью в JavaScript. Достижимыми считаются значения, которые доступны и могут быть использованы. Ниже вы найдете набор базовых достижимых значений:
- Локальные переменные и текущие параметры функции.
- Параметры и переменные для других функций в текущей цепочке вложенных вызовов.
- Глобальные переменные.
Вышеуказанные значения называются корнями.
Другие значения считаются достижимыми, если к ним можно добраться от корня через цепочку ссылок или одну ссылку.
Рассмотрим объект внутри локальной переменной. Если у этого объекта есть свойство, которое ссылается на другой объект, то этот объект называется достижимым. Ссылки также являются достижимыми.
В JavaScript существует фоновый процесс, называемый сборщиком мусора. Он способен отслеживать все объекты и удалять те, которые стали недостижимыми.
Для лучшего восприятия, посмотрите на пример ниже:
Как видите, ссылка на объект изображена стрелкой. Глобальная переменная "book" ссылается на объект. Свойство "name" хранит примитив.
В случае, если значение book перезаписывается, ссылка будет потеряна, как показано ниже:
Таким образом, объект становится недостижимым. Сборщик мусора удаляет данные, освобождая память.
Случай с двумя ссылками
В этом разделе рассмотрим, что случилось, если ссылка была скопирована из book в language таким образом:
Теперь, делая то же самое, мы получим следующее:
Объект по-прежнему будет достижим через глобальную переменную language. Он находится в памяти. После перезаписи language, он может быть удален.
Внутренние алгоритмы
Основной алгоритм сборки мусора известен как "метка и зачистка". Регулярно выполняются ряд шагов сборки мусора. Вот они:
- Сборщик берет корни и отмечает их.
- Затем он посещает и отмечает все ссылки из них.
- Следующим шагом является посещение отмеченных объектов, отметка их ссылок. Невозможно посетить один и тот же объект дважды, так как все посещенные объекты запоминаются.
- Процесс продолжается до тех пор, пока не будут посещены все достижимые ссылки.
- Все объекты, кроме помеченных объектов, удаляются.
И, наконец, объекты, которые не удалось посетить во время вышеописанного процесса, считаются недостижимыми и будут удалены.
Таким образом, описанный процесс сборки мусора работает правильно. Но в JavaScript есть различные оптимизации для улучшения их работы и ускорения. Среди этих оптимизаций - поколенческий сбор, инкрементный сбор и сбор в свободное время.
Заключение
Сборка мусора - это процесс, который происходит автоматически. Его нельзя принудительно запустить или предотвратить.
Объекты могут сохраняться в памяти, пока они достижимы.
Важно знать, что наличие ссылок не равносильно достижимости. Современные движки выполняют продвинутые алгоритмы сборки мусора.
Время Викторины: Проверьте Свои Навыки!
отовы проверить свои знания? Погрузитесь в наши интерактивные викторины для более глубокого понимания и веселого способа закрепить знания.