Как работает сборщик мусора?
Производительность в JS
Сборщик мусора (garbage collector) — это механизм движка, который автоматически освобождает память, занятую объектами, до которых больше нельзя дотянуться из программы.
Принцип достижимости (reachability)
Объект считается «живым», если до него можно добраться от корней (roots): глобальный объект, переменные в стеке текущих вызовов, замыкания. Если объект недостижим — он мусор и может быть удалён.
let user = { name: 'Ann' };
user = null; // прежний объект стал недостижим → будет собранАлгоритм Mark-and-Sweep
Современные движки (V8) используют «пометить и убрать»:
- Mark — от корней помечаются все достижимые объекты.
- 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 — Сборка мусора