Javascript: Сбор мусора
Что происходит, когда что-то больше не нужно? Как движок JavaScript обнаруживает его и очищает?
Доступность
Основная концепция управления памятью в JavaScript — reachability
.
Существует базовый набор изначально достижимых значений, которые не могут быть удалены по очевидным причинам.
Например:
- Выполняемая в данный момент функция, ее локальные переменные и параметры.
- Другие функции в текущей цепочке вложенных вызовов, их локальные переменные и параметры.
- Глобальные переменные.
Эти значения называются корнями.
Любое другое значение считается достижимым, если оно доступно из корня по ссылке или по цепочке ссылок. В движке JavaScript есть фоновый процесс, который называется сборщиком мусора. Он отслеживает все объекты и удаляет те, которые стали недоступны.
Давайте погрузимся в суть и поймем, как это работает
Пример
// user has a reference to the object
let user = {
name: "John"
};
и если значение пользователя перезаписывается, ссылка теряется:
Теперь John становится недосягаемым. Нет никакого способа получить к нему доступ, но если мы скопируем ссылку от пользователя к администратору и перезапишем значение.
Тогда объект по-прежнему доступен через глобальную переменную администратора.
Разметка и зачистка
Алгоритм сборки мусора называется «mark-and-sweep», и эти шаги выполняются регулярно:
- Сборщик мусора берет корни и «mark» (запоминает) их.
- Потом посещает и «mark» все упоминания от них.
- И так далее, пока не будут посещены все доступные ссылки.
- Все объекты, кроме отмеченных, удаляются.
Краткое содержание
- Глобальные переменные считаются корневыми, поэтому будьте внимательны, когда объявляете их или ссылаетесь на них.
- Исходящие ссылки не имеют значения. Только входящие могут сделать объект доступным.