Как забивается память?
Продвинутые темы
Память «забивается» (утечки), когда объекты остаются достижимыми (на них есть ссылки), хотя больше не нужны: забытые таймеры, обработчики, замыкания, растущие кеши, detached DOM-узлы.
Причины утечек памяти
Забытые таймеры/интервалы
setInterval(() => { /* держит ссылки */ }, 1000);
// без clearInterval работает вечно, удерживая объектыНеудалённые обработчики событий
element.addEventListener('click', handler);
// без removeEventListener удерживает element и handlerЗамыкания, удерживающие большие объекты
function outer() {
const huge = new Array(1000000);
return () => huge; // замыкание держит huge, пока функция жива
}Растущие глобальные кеши/коллекции
const cache = {};
cache[key] = value; // без очистки растёт бесконечноDetached DOM-узлы
Удалили узел из DOM, но JS-код держит на него ссылку — не собирается.
Глобальные переменные
Случайно созданные глобали живут всё время.
Почему GC не помогает
GC собирает только недостижимые объекты. Если код держит ссылку (таймер, замыкание, кеш), объект достижим и не собирается — логическая утечка.
Как избежать
- Очищать таймеры (
clearInterval) и обработчики (removeEventListener, cleanup вuseEffect). - Обнулять ненужные ссылки, ограничивать кеши (LRU).
WeakMap/WeakSetдля слабых ссылок.- Диагностика — DevTools Memory (heap snapshots).
Коротко для собеседования
Память забивается утечками — когда объекты остаются достижимыми, хотя не нужны: забытые таймеры/интервалы, неудалённые обработчики, замыкания с большими данными, растущие кеши, detached DOM-узлы, глобальные переменные. GC их не собирает (они достижимы). Избегают очисткой ресурсов, ограничением кешей и WeakMap; диагностируют DevTools Memory.