В каких случаях может происходить утечка памяти в Activity
Что проверяют
Понимаете ли вы, что утечка Activity это ссылка на неё от объекта, который живёт дольше неё. Интервьюер ждёт конкретных сценариев и того, как вы их находите. Следом обычно спрашивают про LeakCanary и про то, почему ViewModel не должна хранить Context.
Как отвечать
Утечка возникает, когда после onDestroy на Activity остаётся сильная ссылка из долгоживущего объекта. Экземпляр держит всё дерево View и ресурсы, а при каждом повороте экрана создаётся новый.
Основные случаи:
- статические поля и синглтоны:
companion objectсо ссылкой на Activity или View, синглтон, в который передали Activity вместоapplicationContext; - внутренние классы и лямбды: анонимный
Runnable, отправленный вHandlerс задержкой, держит Activity, пока сообщение стоит в очереди; - фоновая работа: поток, корутина в
GlobalScope, подписка RxJava безdispose, которые захватили Activity и работают после её уничтожения; - незакрытые регистрации:
BroadcastReceiver, слушателиSensorManagerиLocationManager, колбэки в синглтон-репозиторий без отписки; - ViewModel с контекстом:
ViewModelпереживает поворот экрана, поэтому ссылка на Activity или View в ней держит старый экземпляр. Если нужен контекст, берутAndroidViewModelсApplication.
Как предотвращают: регистрацию и отписку ставят в парные методы жизненного цикла (onStart и onStop), корутины запускают в lifecycleScope или viewModelScope, потоки данных собирают через repeatOnLifecycle. Как находят: LeakCanary подключают через debugImplementation, он сам следит за уничтоженными Activity и показывает цепочку ссылок до корня. Для ручного разбора есть дамп кучи в профайлере Android Studio.
Где спотыкаются
Советуют WeakReference как основное лекарство. Это маскировка: правильнее не держать ссылку дольше жизненного цикла.
Считают утечкой любой OnClickListener на кнопке. Слушатель умирает вместе с View и Activity, опасна только ссылка из объекта, который живёт дольше.
Путают утечку с большим потреблением памяти. Тяжёлые картинки дают OutOfMemoryError и без утечки, но это другая проблема и лечится иначе.