> Как устроен garbage collector (JavaScript)

Уровень: middle · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: ЭНИРАН

Стек: Node.js, JavaScript

> Пример ответа

В JavaScript (и Node.js) сборщик мусора (GC) автоматически освобождает память, которая больше не используется программой. Основной механизм - это трассировка (tracing), а не подсчёт ссылок (как в некоторых старых браузерах). В V8 (движок Node.js) GC работает в несколько этапов:

  1. Молодое поколение (Young Generation) - для короткоживущих объектов. Используется алгоритм Scavenge: память делится на две полуобласти (from-space и to-space). При заполнении from-space живые объекты копируются в to-space, а from-space очищается. Это быстро, но требует паузы.
  2. Старое поколение (Old Generation) - для долгоживущих объектов, которые пережили несколько циклов молодого поколения. Здесь применяется Mark-Sweep-Compact:
    • Mark - обход корневых ссылок (глобальные объекты, стек, замыкания) и пометка всех достижимых объектов.
    • Sweep - удаление непомеченных объектов.
    • Compact - уплотнение памяти для уменьшения фрагментации (опционально, при необходимости).
  3. Инкрементальный сбор - V8 разбивает работу на маленькие шаги, чтобы не блокировать основной поток надолго (важно для интерактивных приложений).
  4. Параллельный и конкурентный сбор - в современных версиях V8 часть работы (например, пометка) выполняется в фоновых потоках, что снижает задержки.

Особенности для Node.js: GC может вызывать паузы (stop-the-world), что критично для высоконагруженных серверов. Для минимизации влияния используют:

  • Управление памятью вручную (например, пулы объектов).
  • Избегание утечек (глобальные переменные, забытые таймеры, замыкания).
  • Настройку флагов V8 (--max-old-space-size, --optimize-for-size).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью