PassFront
  1. PassFront
  2. База знаний
  3. Производительность в JS

Как Garbage Collector чистит память?

Производительность в JS

Garbage Collector чистит память, находя недостижимые объекты (по принципу reachability от корней) и освобождая их с помощью алгоритма Mark-and-Sweep.

Принцип достижимости (reachability)

Объект считается «живым», если до него можно добраться от корней (roots): глобальный объект, переменные в стеке текущих вызовов, замыкания. Недостижимые объекты — мусор:

let user = { name: 'Ann' };
user = null; // объект стал недостижим → кандидат на сборку

Алгоритм Mark-and-Sweep

  1. Mark (пометка) — GC идёт от корней по всем ссылкам и помечает все достижимые объекты.
  2. Sweep (очистка) — проходит по всей памяти и удаляет непомеченные (недостижимые) объекты, освобождая память.
Корни → обход ссылок → пометка достижимых → удаление непомеченных

Оптимизации в современных движках (V8)

Поколенческая сборка (generational)

Объекты делят на «молодые» (недавно созданные) и «старые». Молодые собираются часто и быстро (большинство объектов живут недолго), старые — реже.

Инкрементальная сборка

Работа разбивается на маленькие порции, чтобы не было долгих пауз (не блокировать поток надолго).

Компактизация

Уплотнение памяти после очистки (уменьшает фрагментацию).

Почему не подсчёт ссылок

Reference counting не собирает циклы (объекты ссылаются друг на друга, но недостижимы). Mark-and-Sweep их корректно удаляет.

Коротко для собеседования

GC чистит память по принципу достижимости: помечает объекты, доступные от корней (Mark), удаляет непомеченные недостижимые (Sweep). Оптимизации V8: поколенческая сборка (молодые/старые объекты), инкрементальность (короткие паузы), компактизация. Корректно собирает циклы (в отличие от подсчёта ссылок).

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