Найти в Дзене

Что за утечка памяти и как её отслеживать?

Одна из самых популярных проблем, с которой сталкиваются android-разработчики, — это утечка памяти. Что это такое? При каждом запуске приложения ему выделяется кусочек памяти, который можно использовать. Утечка памяти происходит, когда приложение продолжает занимать память хотя она уже не нужна. Как такое может быть? Например, если приложение создаёт новые объекты, а старые сохраняет. Или, когда ссылки на объекты хранятся даже тогда, когда они уже не используются. Можно провести такую аналогию: у вас есть котик Барсик со своим домиком, игрушками и мисками. Потом котик переехал в деревню, но его домик и игрушки так и остались в квартире и занимают место, хотя котика-то уже нет. Чем это так плохо? Ну утекает и ладно. Это всё может привести к тому, что приложение начнет работать медленно и перестанет реагировать на пользователя. Например, нажимаете вы на кнопку Play, а ничего не происходит. Кроме этого, утечки памяти могут привести к тому, что приложение будет потреблять слишком много рес

Одна из самых популярных проблем, с которой сталкиваются android-разработчики, — это утечка памяти. Что это такое?

При каждом запуске приложения ему выделяется кусочек памяти, который можно использовать. Утечка памяти происходит, когда приложение продолжает занимать память хотя она уже не нужна. Как такое может быть? Например, если приложение создаёт новые объекты, а старые сохраняет. Или, когда ссылки на объекты хранятся даже тогда, когда они уже не используются. Можно провести такую аналогию: у вас есть котик Барсик со своим домиком, игрушками и мисками. Потом котик переехал в деревню, но его домик и игрушки так и остались в квартире и занимают место, хотя котика-то уже нет.

Чем это так плохо? Ну утекает и ладно. Это всё может привести к тому, что приложение начнет работать медленно и перестанет реагировать на пользователя. Например, нажимаете вы на кнопку Play, а ничего не происходит. Кроме этого, утечки памяти могут привести к тому, что приложение будет потреблять слишком много ресурсов, что может привести к быстрой разрядке батареи и перегреву телефона.

Как же с этим бороться? Следить за жизненным циклом объектов, чтобы знать, что они точно удаляются из памяти.

Для отслеживания таких утечек есть отличная библиотека LeakCanary. Она следит за памятью, которую занимают объекты, и показывает уведомление, если эти объекты не удаляются из памяти. А еще библиотека определяет проблемные места в коде и подсказывает как починить.

Для использования нужно просто добавить зависимость в файл gradle:

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'

В документации написано, что больше ничего не нужно делать, но это только если вы используете версию выше 2.0+. В новых версиях LeakCanary используется автоматическое обнаружение утечек памяти, и библиотека самостоятельно регистрирует и настраивает себя для использования.

Если ниже 2.0, то нужно дописать вот это внутри onCreate дефолтной активити или внутри Application:

if (LeakCanary.isInAnalyzerProcess(this)) {
return
}
LeakCanary.install(this)

LeakCanary.isInAnalyzerProcess(this) — метод нужен, чтобы убедиться, что LeakCanary работает только в процессе нашего приложения. Если не добавить эту проверку, то при запуске приложения LeakCanary может быть инициализирована несколько раз, что может привести к проблемам с производительностью и потреблением ресурсов. Кроме того, это может привести к неверной работе, чего мы явно не хотим. Нам и своих проблемных приложений хватает.

LeakCanary.install(this) - это метод инициализации и установки библиотеки LeakCanary. Он регистрирует библиотеку в приложении и настраивает её для использования. Кстати, для Compose писать не надо, потому что там уже встроен этот метод.

Если не вызвать метод LeakCanary.install(this), то мы не установим LeakCanary в свое приложение и это может привести к проблемам с производительностью, поскольку библиотека будет продолжать работу в фоновом режиме, потребляя ресурсы устройства.

Документация здесь: LeakCanary (square.github.io)

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes