Какие сборщики мусора важны на практике и как их применять?
Продвинутые темы
Сборщики мусора: Mark-and-Sweep (основной в JS), поколенческий (generational), инкрементальный, reference counting (устаревший). В V8 — комбинация поколенческого Mark-Sweep-Compact.
Виды/алгоритмы сборки мусора
Mark-and-Sweep (основной)
- Mark — от корней помечаются достижимые объекты.
- Sweep — непомеченные удаляются.
Основной алгоритм в JS-движках; корректно собирает циклы.
Reference Counting (устаревший)
Считает ссылки на объект; при нуле — удаляет.
- Минус: не собирает циклы (объекты ссылаются друг на друга) — утечки. Поэтому не используется в современных движках.
Поколенческий (Generational)
Объекты делят на молодые и старые:
- Молодые (young) — собираются часто и быстро (minor GC, большинство живут недолго).
- Старые (old) — реже (major GC).
Оптимизация на основе «гипотезы поколений».
Инкрементальный / Конкурентный
Работа разбивается на порции (инкрементальный) или идёт параллельно (конкурентный), чтобы паузы были короткими и не блокировали поток.
В V8 (Chrome, Node)
Комбинация:
- Scavenge (minor) — быстрая сборка молодого поколения.
- Mark-Sweep-Compact (major) — полная сборка старого + компактизация (уменьшение фрагментации).
- Инкрементальная и конкурентная для коротких пауз.
Практика
Разработчик не выбирает GC (он встроен), но понимает, как помочь: убирать ссылки, WeakMap/WeakSet, избегать утечек.
Коротко для собеседования
Сборщики мусора: Mark-and-Sweep (основной — помечает достижимое от корней, удаляет остальное, собирает циклы), reference counting (устарел — не собирает циклы), поколенческий (молодые/старые объекты — minor/major GC), инкрементальный/конкурентный (короткие паузы). V8 — комбинация: Scavenge (minor) + Mark-Sweep-Compact (major), инкрементально.