Падает вкладка (memory leak, infinite loop)

Вы работаете с долго живущим приложением, например чатом, что живет в фоновой вкладке у пользователя. Пользователи начали массово жаловаться на то, что по прошествии нескольких дней они переходят на вкладку приложения, а вкладка упала (серый фон, Whoops your tab is crashed). Вы дежурный, вам решать. Что будете делать?
 
🎯 Зачем спрашивают
  • Проверить, умеет ли кандидат работать с реальными инцидентами в продакшене, а не только решать теоретические задачи.
  • Оценить знание инструментов анализа производительности и отладки с помощью дампа памяти; Понять, использовал ли инструменты мониторинга ошибок и производительности;
  • Понять, умеет ли кандидат выстраивать процесс отладки: собрать артефакты → зафиксировать → эскалировать.
  • Проверить, знает ли кандидат, что падение вкладки может быть вызвано разными причинами (memory leak, infinite loop, heavy computation, баги браузера/расширений).
 
📝 Ответ
Коротко:
Необходимо снять снепшот памяти и обнаружить утечки. Далее эскалировать проблему с подробностями.
 
Более подробно:
Наиболее частая причина — утечка памяти или бесконечный цикл. Причины утечки памяти могут быть:
  • забытые и не очищенные таймеры, event listeners
  • не очищенные объекты в глобальной области, кэш
  • накопление DOM-нод
  • WebSocket / Long polling — соединения не переустанавливаются, накапливаются ресурсы
 
Но существуют и другие причины:
  • out-of-memory из-за heavy computation
  • баг браузера/расширения
 
Heap snapshot
Наша задача как дежурного — идентифицировать проблему, собрать артефакты с доказательствами и передать задачу в разработку (или исправить самому). Самое минимальное, что можно сделать в ложившейся ситуации — снять Heap snapshot. То есть получить состояние памяти приложения на момент снятия снепшота.
💡
Снепшоты можно сравнивать. Поэтому сделаем 2 снепшота: первый на момент старта приложения, второй — немного погодя.
 
Алгоритм действий
  1. Откройте приложение в Chrome
  1. Запустите DevTools и перейдите во вкладку Memory
  1. На вкладке Memory выбери режим Heap snapshot
  1. Нажмите Take snapshot — это будет наша точка отсчёта
  1. Подождите немного, чтобы приложение “побродило”
  1. Сними ещё один snapshot
  1. Сравни два snapshot: в фильтре поставьте «Objects allocated between Snapshot 1 and 2».
  1. Теперь задача найти объекты, которые не освобождаются (например Array, event listeners).
Есть и другие инструменты, позволяющие погрузиться глубже в проблему и собрать больше информации.
Allocation Sampling (живое наблюдение)
Позволяет посмотреть, какие функции создают больше всего объектов.
Алгоритм действий:
  1. В Memory выбери режим Allocation sampling.
  1. Нажми Start.
  1. Подождите немного, чтобы приложение “побродило”
  1. Нажми Stop.
  1. Посмотрите, какие функции создают больше всего объектов.
 
Мониторинг через Performance
Мощный инструмент для профилирования перфоманса приложения. С помощью графика можно посмотреть в динамике на ключевые ресурсы (JS Heap, DOM ноды, Listeners) и обнаружить аномалии, например, в накопления памяти.
notion image
 
Алгоритм действий:
  • Перейдите во вкладку Performance.
  • Нажмите Record (красная кнопка).
  • Подождите немного, чтобы приложение “побродило”
  • Остановите запись
  • Задача отсмотреть график JS Heap → линия растёт и не возвращается вниз (сигнал проблемы) и/или много активных timers и callbacks.
 
 
⚖️ Компромиссы
  • Heap snapshot даёт картину, но тяжело читать. Snapshot не показывает твои исходные имена переменных, из-за чего не легко идентифицировать проблемный код.
  • Heap snapshot даёт картину → но это «статический снимок», и он не отражает динамику (в отличие от Performance/Timeline)
  • Allocation sampling легче, но не всегда показывает удержание объектов.
  • Performance удобен для динамики, но шумный график.
 
🔎 Встречные вопросы
  • А что делать, если проблема воспроизводится только у пользователя, но не у вас?(Remote debugging, Chrome Tracing, Sentry memory tracking).
  • Как автоматизировать мониторинг утечек? (heap usage metrics, alarms).
  • Что кроме memory leak может уронить вкладку?
 
 
🚩 Красные флаги
  • Ну, передеплою приложение
  • Ничего страшного, вкладки иногда падают
  • Посмотрю console.log и всё.
  • Игнорировать артефакты, просто починю код по наитию.
 
🛠 Практика
Задача
StackBlitzStackBlitzmy-leaky-chat - StackBlitz Приложение, эмулирующее работу чата. В коде есть ошибки, преднамеренно забивающие память. Задача — отпрофилировать приложение различными способами и оформить “тикет” для команды разработки на хотфикс. Опишите проблему и приложите все необходимые артфакты-доказательства.
 
 
📚 Источники / ссылки