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