Коротка відповідь
juniorGarbage Collector — це механізм управління пам’яттю, який автоматично звільняє об’єкти, що більше не доступні. Він працює за принципом «підрахунку посилань» або «маркування‑збирання». У JavaScript GC запускається під час циклу event loop, коли стек викликів порожній. `let obj = {}; setTimeout(()=>{obj=null;}, 1000);`
Повне пояснення
Що це і навіщо Garbage Collector (GC) – автоматичний менеджер пам’яті, що звільняє ресурси, які більше не використовуються. Це зменшує ризик витоків пам’яті та спрощує розробку.
Ключові принципи
- Reference counting – підрахунок посилань на об’єкт; коли лічильник досягає нуля, об’єкт звільняється.
- Mark‑and‑Sweep – маркування всіх доступних об’єктів, після чого збирається не‑марковані.
- Generational GC – розділення об’єктів за «вік»; молоді об’єкти збираються частіше.
Як це працює GC запускається асинхронно, часто під час event loop. Він сканує граф об’єктів, визначає доступність і видаляє ті, що недоступні. Під час збірки може бути пауза (stop‑the‑world), що впливає на продуктивність.
Практика і реалізація
У браузерах GC керується V8 (Chrome, Edge) або SpiderMonkey (Firefox). У Node.js використовується той же V8‑engine. Розробник не викликає GC вручну, але може підказати збірнику через global.gc() (з потрібними флагами).
Тестування
Для перевірки витоків можна використовувати --inspect + Chrome DevTools, або бібліотеки типу memwatch-next. Приклад Jest‑тесту:
test('no memory leak', () => {
const arr = [];
for (let i=0;i<1e6;i++) arr.push({i});
expect(arr.length).toBe(1e6);
});
Оптимізація, типові помилки та edge cases
- Не створюйте зайвих анонімних функцій у циклі.
- Уникайте глобальних змінних; вони живуть до завершення процесу.
- Пам’ятайте про замикання:
setTimeout(()=>{…}, 0)зберігає посилання на зовнішні змінні. - Використовуйте
WeakMap/WeakSetдля кешів, що не повинні блокувати GC.
Диагностика і відладка
- Симптом: збільшення пам’яті, падіння продуктивності.
- Причина: виток через замикання, глобальні об’єкти.
- Дія: перевірте heap snapshot у DevTools, видаліть непотрібні посилання.
Часті помилки (8)
- Залишені таймери (
setInterval). - Неочікувані глобальні змінні.
- Масиви великих об’єктів без очищення.
- Замикання у колекціях.
- Використання
new Array(size)без заповнення. - Неочікувані об’єкти в
Map/Set. - Пам’ятні ланцюжки через DOM‑елементи.
- Відсутність
WeakMapдля кешу.
Cheatsheet
- GC → автоматично, не викликається вручну.
- Reference counting + Mark‑and‑Sweep → основні алгоритми.
- Generational GC → молоді об’єкти збираються частіше.
WeakMap/WeakSet→ не блокують GC.
Follow‑up питання
- Як впливає GC на продуктивність у Node.js?
- Що таке «stop‑the‑world» і коли воно трапляється?
- Які інструменти для профілювання пам’яті в браузері?