Думаю, ни для кого не секрет, что в рамках этой статьи данная тема обязательна к освещению. Утечки памяти. Все говорят, что их нужно избегать, но мало кто говорит что можно сделать и как обнаружить.
Начнем с того, что же называется «утечкой памяти». В строгом понимании, объект можно назвать утечкой памяти, если он продолжает существовать в памяти даже после того, как на него потеряны все ссылки. Подобное может не только замедлить наше устройство, но и привести к неожиданному поведению, вызвать баги. К примеру, вы отправляете запрос каждые 20 секунд в Runnable на новом потоке. Не будем сейчас думать о том, что у нас есть lifecycle- и viewModelScope, которые автоматически очищаются вместе с их родителями. Представим старое приложение, работающее на потоках. Передадим наш Runnable в поток и запустим. Что мы видим? Картина такова, что вполне возможно, что даже при выходе с активити, вы будете продолжать отправлять запросы, так как ссылка все еще живая. Думаю, что такое поведение вряд ли кого-то устроит. Так что же делать?
Используйте встроенный профайлер в андроид студии на выявление GC Leaks. Самый простой из способов выявления утечек и неэкономного использования памяти. Профайлер встроен в андроид студию, находится на видном месте и весьма легок в использовании.
Использование инструмента, созданного компанией Square (да-да, той самой, что создали Retrofit). Называется этот инструмент LeakCanary. Что он делает? Эта канарейка ищет по приложению неиспользуемые ссылки и, в случае если они есть, выдает уведомление. Что приятно, клик на уведомление переводит нас на новую активити, в которой вы можете увидеть, как произошла утечка и с каким именно объектом, для последующего устранения. Чтобы использовать библиотеку, нужно всего лишь импортировать ее с помощью debugImplementation. Просто в использовании, но представляет собой удобный и важный инструмент, почему бы и нет?
Вещь, о которой мало кто говорит, но ее необходимо знать. Аккуратно используйте методы по типу lifecycleScope.launchWhenStarted. Использование данного метода внутри onStart вызовет утечку памяти. Вызов launchWhenStarted должен быть не позднее чем в onCreate.