PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Как забивается память?

Продвинутые темы

Память «забивается» (утечки), когда объекты остаются достижимыми (на них есть ссылки), хотя больше не нужны: забытые таймеры, обработчики, замыкания, растущие кеши, 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.

Другие вопросы раздела