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

Как работает сборщик мусора?

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

Сборщик мусора (garbage collector) — это механизм движка, который автоматически освобождает память, занятую объектами, до которых больше нельзя дотянуться из программы.

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

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

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

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

Современные движки (V8) используют «пометить и убрать»:

  1. Mark — от корней помечаются все достижимые объекты.
  2. Sweep — непомеченные удаляются, память освобождается.

Дополнительно применяют поколенческую сборку (новые/старые объекты), инкрементальность и компактизацию, чтобы уменьшить паузы.

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

Простой reference counting не справляется с циклическими ссылками:

function leak() {
  const a = {};
  const b = {};
  a.ref = b;
  b.ref = a; // цикл, но обе недостижимы извне
}

Mark-and-Sweep их корректно собирает, т.к. они недостижимы от корней.

Утечки памяти

  • Забытые таймеры/обработчики.
  • Ссылки в замыканиях, которые не обнуляются.
  • Глобальные переменные и растущие кеши.

Для «слабых» ссылок, не мешающих сборке, есть WeakMap / WeakSet.

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

GC автоматически освобождает недостижимые объекты по принципу reachability от корней, используя Mark-and-Sweep. Он корректно собирает циклы. Утечки возникают из-за забытых ссылок, таймеров и обработчиков; WeakMap/WeakSet помогают их избегать.

Подробнее: learn.javascript.ru — Сборка мусора

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