Garbage collector
Тема дорожной карты · Node.js
Node.js использует сборщик мусора движка V8 для автоматического управления памятью кучи, освобождая объекты, которые больше недостижимы, — разработчикам не нужно вручную освобождать память, как в C или C++. Сборщик мусора V8 использует поколенческую стратегию: новые объекты помещаются в «молодое поколение» (nursery), и объекты, пережившие несколько малых циклов GC, переводятся в «старое поколение», которое собирается реже с помощью алгоритма mark-and-sweep. В процессе Node.js сборка мусора выполняется конкурентно и инкрементально, чтобы минимизировать паузы цикла событий, однако большие кучи или частые полные циклы GC всё равно могут вызывать всплески задержек, заметные в процентилях времени ответа. Разработчики могут наблюдать за активностью GC в Node.js, передавая флаг --trace-gc среде выполнения, используя API v8.getHeapStatistics() модуля v8 или экспортируя метрики process.memoryUsage() в Prometheus для дашбордов. Настройка поведения GC в Node.js с помощью флагов, таких как --max-old-space-size (установка максимального размера кучи в МБ), иногда необходима для память-интенсивных серверных сервисов, работающих внутри Docker-контейнеров с фиксированными ограничениями памяти.
Как это работает
Garbage collector меряется event-loop lag, latency запросов, throughput, памятью. Инструменты: clinic.js для flame graph, 0x для V8-профилей, autocannon для HTTP-нагрузки, флаг --prof для встроенного профайлера, --inspect для Chrome DevTools. Обычные победы: кешировать горячие SQL-запросы (Redis), избегать sync I/O, переиспользовать HTTP-keepalive (http.Agent), стримить большие ответы вместо буферизации. CPU-профиль почти всегда указывает на одну горячую функцию — её первой.
Когда применять
Меряйте до оптимизации — autocannon против stage-эндпойнта показывает, где стена. Агрессивный кеш на границе (CDN, reverse proxy) и на data-слое (Redis). CPU-тяжёлую работу — в очередь (BullMQ, Redis Streams), чтобы latency запросов оставалась низкой. Для sub-1ms HTTP-оверхеда — Fastify или uWebSockets.js; для всего остального Express + хороший кеш бьёт преждевременные переписывания.
Типичные ошибки
Ловушки Garbage collector: оптимизация без профиля (чините не то); микро-бенчмарки, которые врут (реальная нагрузка другая); игнор утечек памяти до OOM (heapdump + clinic.js); over-cluster на одном хосте (context-switch стоит больше параллелизма после числа CPU). Prometheus/Grafana — с первого дня в production.