Утечки памяти в Android | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Python Developer. Professional
-3%
Разработчик на Spring Framework
-5%
iOS Developer. Professional
-8%
Golang Developer. Professional
-6%
Базы данных
-12%
Agile Project Manager
-5%
Android Developer. Professional
-11%
Microservice Architecture
-5%
C++ Developer. Professional
-5%
Highload Architect
-6%
JavaScript Developer. Basic
-8%
Kotlin Backend Developer
-9%
C# Developer. Professional
-9%
Team Lead
-6%
Алгоритмы и структуры данных Разработчик программных роботов (RPA) на базе UiPath и PIX Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Vue.js разработчик VOIP инженер NoSQL Супер-практикум по использованию и настройке GIT Symfony Framework iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
DevOps практики и инструменты
-12%
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Экcпресс-курс «ELK»
-10%
Инфраструктурная платформа на основе Kubernetes
-6%
Administrator Linux.Basic
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Дизайн сетей ЦОД
-13%
PostgreSQL
-8%
Разработчик программных роботов (RPA) на базе UiPath и PIX Reverse-Engineering. Professional Внедрение и работа в DevSecOps Administrator Linux. Advanced Infrastructure as a code in Ansible Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Утечки памяти в Android

Android_Deep_4.12-5020-52e757.png

Плохо, когда объект остаётся в памяти дольше, чем это реально нужно. Ведь используемые ресурсы пригодятся для решения других задач, которые могут иметь для пользователей не меньшую ценность. Давайте посмотрим, почему утечки памяти в Android-приложениях — это плохо. И заодно разберём, как обнаружить утечки памяти.

Почему утечки памяти нежелательны?

Во-первых, когда происходят утечки, становится меньше памяти, доступной для использования. Это, в свою очередь, приводит к более частым запускам сборщика мусора. Частые запуски приостанавливают рендеринг пользовательского интерфейса, плюс приводят к остановке прочих компонентов, нужных для нормальной работы системы. В результате прорисовка кадра длится дольше обычных 16 мс. И если этот показатель становится порядка 100 мс, пользователи начинают замечать замедления в работе Android-приложений.

1_9xfTRUjO0xHzqzstycGjyg_1-20219-d524b8.png 1_n3B2N9NZticR70EtsCX1LQ_1-20219-a54edd.png

Скорость отклика приложений контролируют как менеджер активности, так и менеджер окон. При этом система открывает для приложения диалог ANR (Android Not Responding) в том случае, когда выполняется одно из двух условий: — приложение не отвечает на нажатия в течение 5 секунд; — BroadcastReceiver не завершается в течение 10 секунд.

1_8iJT_6L8TXy81vvp4Ze_mw_1-20219-a8cee6.png

Разумеется, никому не понравится наблюдать данное сообщение на экранах своего девайса.

Вторая проблема заключается в том, что приложение с утечкой памяти не получает дополнительные ресурсы от неиспользуемых объектов. Да, будет выполняться запрос на выделение дополнительной памяти, но в определённый момент система перестанет выделять дополнительную память, и приложение упадёт.

Результат объяснять не надо — клиенты недовольны, отзывы негативны, приложение удаляется пользователем.

Определяем утечку памяти в Android-приложениях

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

Один из таких инструментов — Leak Canary от Square. Инструмент создаёт ссылки на объекты вашего Android-приложения, а также проверяет удаляются ли данные ссылки сборщиком мусора. Если ссылки не удаляются, информация заносится в файл .hprof, после чего выполняется анализ наличия утечек памяти. Когда утечка обнаружится, вы получите соответствующее сообщение. Однако помните, что рекомендуется использовать Leak Canary до выпуска вашего приложения в production.

6_1024x568_1-20219-21a2e9.png

Второй инструмент для поиска утечек памяти, который стоит упомянуть, входит в Android Studio. Если вы подозреваете, что часть кода является причиной утечек, выполните следующие действия: 1) скомпилируйте и запустите отладочную версию сборки на эмуляторе либо устройстве, подключённому к вашему ПК; 2) перейдите к подозрительной операции, а потом вернитесь к предыдущему действию, чтобы вывести подозрительную операцию из стека задач; 3) откройте в Android Studio "Android Monitor window → Memory section" и нажмите на клавишу запуска сборщика мусора (Initiate GC). Потом нажмите кнопку «Dump Java Heap»;

1_QQOAOOqaYwGgJtac8PPNbA_1-20219-1e493c.png

4) далее откроется файл .hprof. Есть несколько вариантов проверки утечки с помощью этого файла. Например, для автоматического поиска используйте Analyzer Tasks (находится в правом верхнем углу). Также можно переключиться в режим Tree View, чтобы найти действие, которое нужно будет отключить. Если после проверки данных Total Count вы найдёте отличия в данных, значит, где-то есть утечка.

1_42aKfq1j9UA2lWnutY9mTA_1-20219-118178.png

5) Обнаружив утечку памяти, останется проверить дерево ссылок, чтобы понять, какой объект вызывает утечку.

Удачной вам разработки!

Материал написан на основе статьи «[Memory Leak Patterns in Android (https://android.jlelse.eu/memory-leak-patterns-in-android-4741a7fcb570)».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🔥 Только до 28.02
Успейте приобрести курсы февраля на выгодных условиях! Подробности в чате.