Що таке збирач сміття в JavaScript?
Збірник сміття — це вбудований механізм у JavaScript, який автоматично керує пам'яттю. Він відповідає за вивільнення пам'яті, зайнятої об'єктами, які більше не використовуються в програмі.
Ви не керуєте пам'яттю вручну — JavaScript-движок робить це за вас (наприклад, V8 у Chrome/Node.js).
Як працює збірник сміття?
JavaScript виділяє пам'ять для змінних та об'єктів, коли вони створюються, і вивільняє її, коли вони більше не доступні.
Основний принцип:
Об'єкт вважається "сміттям", якщо на нього більше немає посилань.
Приклад:
let user = { name: "Alice" };
user = null; // Тепер об'єкт може бути видалений з пам'ятіАлгоритми, що використовуються в GC
Позначити та прибрати
Найпоширеніший алгоритм:
- Позначає всі об'єкти, доступні через змінні (кореневі об'єкти).
- Всі інші об'єкти видаляються як "сміття".
window / глобальні змінні
Об'єкт A
Об'єкт B
Об'єкт C (недоступний)
У цьому прикладі об'єкт C є недоступним і буде видалений.
Підрахунок посилань
Кожен об'єкт зберігає число, що показує, скільки посилань на нього вказує. Якщо лічильник = 0, об'єкт видаляється.
Недолік: циклічні посилання не видаляються.
let a = {};
let b = {};
a.ref = b;
b.ref = a;
// Обидві змінні null, але об'єкти все ще посилаються один на одного
a = null;
b = null; // Потенційна витрата пам'яті!Як уникнути витоків пам'яті?
- Видаляйте невикористовувані таймери:
clearInterval,clearTimeout - Очищайте підписки, обробники подій
- Обнуляйте великі об'єкти та посилання на DOM:
ref.current = null - Уникайте глобальних змінних
- Використовуйте
WeakMap,WeakSet— вони не перешкоджають збору сміття
Ознаки витоків пам'яті
- Постійне зростання пам'яті під час використання
- Затримки, зависання, лаги
- Високе споживання оперативної пам'яті в DevTools → вкладка
Performance/Memory
Важливо:
Збір сміття в JavaScript є не миттєвим — це процес, який виконується періодично. Тому вивільнення пам'яті може відбуватися з затримкою.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.