Что такое Garbage Collector в JavaScript?
Cборщик мусора (Garbage Collector) — это встроенный механизм в JavaScript, который автоматически управляет памятью. Он отвечает за освобождение памяти, занятой объектами, которые больше не используются в программе.
Вы не управляете памятью вручную — за вас это делает JavaScript-движок (например, V8 в Chrome/Node.js).
Как работает сборщик мусора?
JavaScript выделяет память под переменные и объекты, когда они создаются, и освобождает её, когда они больше не достижимы.
Основной принцип:
Объект считается "мусором", если на него больше нет ссылок.
Пример:
let user = { name: "Alice" };
user = null; // Теперь объект можно удалить из памяти
Алгоритмы, используемые в GC
Mark-and-Sweep (Пометка и зачистка)
Наиболее распространённый алгоритм:
- Помечает все объекты, доступные через переменные (корневые объекты).
- Все остальные объекты — удаляются, как "мусор".
В этом примере объект C
— недостижим и будет удалён.
. Reference Counting (Подсчёт ссылок)
Каждый объект хранит число, показывающее, сколько на него ссылаются. Если счётчик = 0, объект удаляется.
Недостаток: циклические ссылки не удаляются.
let a = {};
let b = {};
a.ref = b;
b.ref = a;
// Обе переменные — null, но объекты всё ещё ссылаются друг на друга
a = null;
b = null; // Потенциальная утечка памяти!
Как избежать утечек памяти?
- Удаляйте неиспользуемые таймеры:
clearInterval
,clearTimeout
- Очищайте подписки, обработчики событий
- Обнуляйте большие объекты и DOM-ссылки:
ref.current = null
- Избегайте глобальных переменных
- Используйте
WeakMap
,WeakSet
— они не мешают сборке мусора
Признаки утечек памяти
- Постоянный рост памяти при использовании
- Задержки, фризы, лаги
- Высокое потребление RAM в DevTools → вкладка
Performance/Memory
Важно:
Сборка мусора в JavaScript не мгновенна — это процесс, который выполняется периодически. Поэтому освобождение памяти может происходить с задержкой.