Node.js использует сборщик мусора V8 с двумя основными механизмами:
Автоматическая сборка обычно эффективна, но есть специфические случаи, когда ручное управление предпочтительнее.
// Система торговых алгоритмов
function processMarketData(data) {
// Отключаем GC на время критической операции
if (gc.isEnabled()) gc.disable();
executeTimeSensitiveCalculation(data);
// Включаем обратно
gc.enable();
}
Почему: Автоматический GC может вызвать непредсказуемые задержки (stop-the-world)
const { gc } = require('node:v8');
http.createServer((req, res) => {
// Принудительная сборка между запросами
if (shouldOptimizeLatency) {
gc();
}
handleRequest(req, res);
});
Почему: Гарантированное отсутствие GC-пауз во время обработки запросов
// В Electron-приложении
function renderFrame() {
gc.disable();
// Критичный код рендеринга
drawComplexScene();
// Отложенный вызов GC
setTimeout(() => gc.enable(), 100);
}
Почему: Предотвращение подтормаживаний анимации
function processBatch(batch) {
gc.disable();
// Обработка крупного batch данных
const result = batch.map(transform);
// Принудительная очистка после обработки
gc.enable();
gc();
return result;
}
Почему: Избегание многократного срабатывания GC при обработке каждого элемента
class TradingEngine {
constructor() {
this.disableGC();
this.initCriticalComponents();
}
disableGC() {
if (global.gc) {
this.originalGC = global.gc;
global.gc = () => console.warn('GC manually disabled');
}
}
}
Почему: Микросекундные задержки недопустимы
Включение флага --expose-gc
node --expose-gc your-script.js
Пример ручного вызова
if (global.gc) {
console.time('GC');
global.gc();
console.timeEnd('GC');
}
Оптимальное время вызова
const v8 = require('v8');
setInterval(() => {
console.log(v8.getHeapStatistics());
}, 5000);
Отключать автоматический GC стоит только:
Обязательные условия:
Лучшие практики:
В 95% случаев автоматический GC работает оптимально - не вмешивайтесь без необходимости