Сборка мусора в JavaScript

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

Основная Концепция

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

Вышеуказанные значения называются корнями.

Другие значения считаются достижимыми, если к ним можно добраться от корня через цепочку ссылок или одну ссылку.

Рассмотрим объект внутри локальной переменной. Если у этого объекта есть свойство, которое ссылается на другой объект, то этот объект называется достижимым. Ссылки также являются достижимыми.

В JavaScript существует фоновый процесс, называемый сборщиком мусора. Он способен отслеживать все объекты и удалять те, которые стали недостижимыми.

Для лучшего восприятия, посмотрите на пример ниже:

Javascript object reference
// book has a reference to the object let book = { name: "Javascript" }; console.log(book);

Как видите, ссылка на объект изображена стрелкой. Глобальная переменная "book" ссылается на объект. Свойство "name" хранит примитив.

В случае, если значение book перезаписывается, ссылка будет потеряна, как показано ниже:

Javascript object reference lost
// book has a reference to the object let book = { name: "Javascript" }; book = null; console.log(book);

Таким образом, объект становится недостижимым. Сборщик мусора удаляет данные, освобождая память.

Случай с двумя ссылками

В этом разделе рассмотрим, что случилось, если ссылка была скопирована из book в language таким образом:

Javascript object a case of two reference
// book has a reference to the object let book = { name: "Javascript" }; let language = book; console.log(language);

Теперь, делая то же самое, мы получим следующее:

Javascript object reference lost
// book has a reference to the object let book = { name: "Javascript" }; let language = book; console.log(language); book = null; console.log(book);

Объект по-прежнему будет достижим через глобальную переменную language. Он находится в памяти. После перезаписи language, он может быть удален.

Внутренние алгоритмы

Основной алгоритм сборки мусора известен как "метка и зачистка". Регулярно выполняются ряд шагов сборки мусора. Вот они:

  • Сборщик берет корни и отмечает их.
  • Затем он посещает и отмечает все ссылки из них.
  • Следующим шагом является посещение отмеченных объектов, отметка их ссылок. Невозможно посетить один и тот же объект дважды, так как все посещенные объекты запоминаются.
  • Процесс продолжается до тех пор, пока не будут посещены все достижимые ссылки.
  • Все объекты, кроме помеченных объектов, удаляются.

И, наконец, объекты, которые не удалось посетить во время вышеописанного процесса, считаются недостижимыми и будут удалены.

Таким образом, описанный процесс сборки мусора работает правильно. Но в JavaScript есть различные оптимизации для улучшения их работы и ускорения. Среди этих оптимизаций - поколенческий сбор, инкрементный сбор и сбор в свободное время.

Заключение

Сборка мусора - это процесс, который происходит автоматически. Его нельзя принудительно запустить или предотвратить.

Объекты могут сохраняться в памяти, пока они достижимы.

Важно знать, что наличие ссылок не равносильно достижимости. Современные движки выполняют продвинутые алгоритмы сборки мусора.

Время Викторины: Проверьте Свои Навыки!

отовы проверить свои знания? Погрузитесь в наши интерактивные викторины для более глубокого понимания и веселого способа закрепить знания.

Считаете ли это полезным?