Ответ вслух Senior Производительность обновлено

Утечки памяти во Flutter

Вопрос

Как появляются утечки памяти во Flutter-приложении и как вы их находите?

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

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

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

Коротко

Образцовый ответ: «Утечка во Flutter обычно означает, что State или крупный объект недостижим для пользователя, но достижим для сборщика. Чаще всего его держит колбэк: подписка на Stream, слушатель контроллера, таймер или сохранённое в синглтоне замыкание.

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

  • Неотменённые подписки, таймеры и слушатели держат `State` после `dispose`

  • Неосвобождённые контроллеры (`AnimationController`, `TextEditingController`, `ScrollController`)

  • Замыкания, сохранённые в долгоживущих объектах (синглтоны, кеши)

  • Большие изображения и неограниченные кеши

  • Поиск: DevTools Memory, сравнение снимков, `leak_tracker` в тестах

  • Профилактика: линтеры, правило «создал в initState, освободил в dispose»

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

  • Как найти, кто держит объект?
  • Почему GlobalKey может привести к утечке?

Разбор

Образцовый ответ: «Утечка во Flutter обычно означает, что State или крупный объект недостижим для пользователя, но достижим для сборщика. Чаще всего его держит колбэк: подписка на Stream, слушатель контроллера, таймер или сохранённое в синглтоне замыкание. Вторая группа: контроллеры без dispose, они ещё и держат тикеры. Третья: кеши без ограничений и картинки в полном разрешении. Ищу так: в DevTools Memory делаю снимок, открываю и закрываю экран несколько раз, делаю второй снимок и сравниваю, каких классов стало больше, затем смотрю путь удержания. В тестах подключаю leak_tracker. Профилактика простая: всё, что создано в initState, освобождается в dispose, а сервисы с подписками имеют свой dispose»

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

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