Ответ вслух Senior Память и сборка мусора обновлено

Память SPA растёт со временем

Вопрос

Пользователи жалуются, что после пары часов работы SPA начинает тормозить, а вкладка занимает гигабайт. Как будете искать и исправлять?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Сначала воспроизвожу: беру типичный сценарий, например открыть карточку и вернуться к списку, и прогоняю его много раз с записью Performance и включённой памятью. Нормальная картина это пила: память растёт и падает после сборки.

Что должно прозвучать в ответе

  • Воспроизвести сценарий и подтвердить рост: Performance с Memory, ступенчатый рост после сборок

  • Сузить до действия: какие переходы или операции увеличивают память

  • Heap snapshots до и после серии повторов, Comparison, Retainers

  • Проверить типичные причины: подписки, таймеры, detached DOM, глобальные кеши, сторы

  • Исправить и проверить тем же сценарием, добавить защиту: лимиты кешей, линтер на очистку эффектов

  • Мониторинг в проде: `performance.memory` или `measureUserAgentSpecificMemory` выборочно

Что могут спросить следом

  • Как отличить утечку от нормальной работы GC на графике памяти?
  • Что такое retained size и shallow size?
  • Что делать, если удерживает объект сторонняя библиотека?

Разбор

Образцовый ответ: «Сначала воспроизвожу: беру типичный сценарий, например открыть карточку и вернуться к списку, и прогоняю его много раз с записью Performance и включённой памятью. Нормальная картина это пила: память растёт и падает после сборки. Утечка выглядит как ступени: после каждой сборки базовый уровень выше. Нашёл действие, дальше heap snapshot до, десять повторов, принудительная сборка кнопкой с корзиной, второй снимок и режим Comparison. Смотрю, чего стало больше: экземпляров компонента, отсоединённых DOM-узлов, массивов. У подозрительного объекта открываю Retainers и иду по цепочке до корня, там обычно слушатель на window, интервал, подписка на стор или глобальный кеш. Обращаю внимание на retained size: сколько освободится, если убрать этот объект. Исправляю, повторяю тот же сценарий и убеждаюсь, что ступени ушли. Чтобы не вернулось, ставлю лимиты на кеши, включаю правила линтера для эффектов, а в проде собираю метрику памяти выборочно».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.