Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: memory

Как избежать утечек памяти в js?

Этот вопрос проверяет понимание модели памяти в JavaScript и умение выявлять и предотвращать распространенные сценарии, ведущие к утечкам памяти.

Короткий ответ

Утечки памяти в JS возникают, когда объекты, которые больше не нужны, не удаляются сборщиком мусора, потому что на них остаются ссылки. Чтобы этого избежать, нужно: 1) Убирать слушатели событий (Event Listeners) с DOM-элементов при их удалении. 2) Не хранить ссылки на DOM-элементы в глобальных переменных или замыканиях дольше необходимого. 3) Осторожно работать с замыканиями и большими объектами, хранящимися в памяти. 4) В современных фреймворках (React, Vue) следить за отпиской от подписок (setInterval, WebSocket) в хуках жизненного цикла размонтирования.

Длинный ответ

JavaScript использует автоматическое управление памятью с помощью сборщика мусора (Garbage Collector, GC). GC удаляет объекты, на которые больше нет ссылок из "живых" объектов.

Распространенные причины утечек памяти и их решение:

  1. Забытые таймеры и подписки:

    • Проблема: setInterval, setTimeout или подписки на события (например, RxJS) продолжают работать и держать ссылки на объекты, даже если компонент, который их использовал, уже не нужен.

    • Решение: Всегда очищайте таймеры и отписывайтесь от событий при уничтожении компонента.

    javascript

    // React пример с useEffect
    useEffect(() => {
      const intervalId = setInterval(() => {}, 1000);
      const subscription = someObservable.subscribe();
    
      // Функция очистки
      return () => {
        clearInterval(intervalId);
        subscription.unsubscribe();
      };
    }, []);
  2. Отсоединенные DOM-элементы:

    • Проблема: Если в переменной сохраняется ссылка на удаленный из DOM элемент, он не сможет быть собранным мусором.

    • Решение: Обнуляйте ссылки на DOM-элементы после их удаления.

    javascript

    let element = document.getElementById('my-element');
    // ... работа с элементом
    element.remove(); // Удаляем из DOM
    element = null;   // Удаляем ссылку из JS
  3. Замыкания (Closures):

    • Проблема: Замыкание может непреднамеренно удерживать ссылку на большую структуру данных или DOM-элемент, даже если используется лишь малая ее часть.

    • Решение: Будьте внимательны, что захватывают ваши замыкания. После использования обнуляйте переменные, ссылающиеся на большие объекты.

  4. Глобальные переменные:

    • Проблема: Объекты, хранящиеся в глобальных переменных, никогда не будут удалены.

    • Решение: Избегайте глобальных переменных. Используйте локальные переменные и модули.

  5. Кеши без стратегии очистки:

    • Проблема: Простой кеш в виде объекта или Map, который растет бесконечно.

    • Решение: Реализуйте стратегии очистки кеша (например, LRU - "Least Recently Used" или ограничение по размеру).

Вывод: Для предотвращения утечек памяти выработайте привычку всегда освобождать ресурсы (таймеры, подписки, ссылки на DOM) при разрушении объекта или компонента. Используйте инструменты разработчика (например, Memory Profiler в Chrome DevTools) для поиска и диагностики утечек.

Уровень

  • Рейтинг:

    4

  • Сложность:

    8

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#memory

Подпишись на React Developer в телеграм