PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Какие сборщики мусора важны на практике и как их применять?

Продвинутые темы

Сборщики мусора: Mark-and-Sweep (основной в JS), поколенческий (generational), инкрементальный, reference counting (устаревший). В V8 — комбинация поколенческого Mark-Sweep-Compact.

Виды/алгоритмы сборки мусора

Mark-and-Sweep (основной)

  1. Mark — от корней помечаются достижимые объекты.
  2. 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), инкрементально.

Другие вопросы раздела