Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

суббота, 25 марта 2017 г.

Используем Android Studio для поиска утечек памяти

Сегодня я расскажу вам, как обнаружить утечку памяти в вашем приложении, используя Android Studio. Способ не претендует на революционное решение, наоборот, всё давно известно и описано в интернете, но для разработчиков использующих Android Studio. На самом деле, тема очень обширная, поэтому я рассмотрю только основные моменты.

Осторожно, трафик! В посте много скриншотов!



Итак, нам понадобятся:
  • Приложение (сборка Debug)
  • Android Studio (AS)
  • Время, примерно 30 минут (для подробного анализа и наблюдения).
Внимание! Не пытайтесь использовать monitor.bat из SDK, хоть он и обладает почти таким же функционалом, но почему-то делает кривые дампы памяти. Может быть ситуация поменялась с выходом новой версии SDK, я не проверял.

Начинаем.

Запускаем AS и создаём любой проект (в моём случае, получился проект MyApplication5).


Далее нажимаем на кнопку «Android Monitor», откроется окно.


Теперь устанавливаем приложение на устройство. Включаем «режим разработчика», включаем «Отладку по USB» в Android. Подключаем устройство к компьютеру и возвращаемся в AS. Устройство должно появиться в списке.


На устройстве:
  • Включите переход в режим сна через 30 минут или отключите его вообще (настройка «Дисплей»)
  • Запустите приложение и вернитесь в AS
Настройте Android Monitor на ваше приложение.


Теперь начинаем использовать приложение и наблюдать за вкладками:
  • «logcat» - отображает события (срабатывание GC и т.д.), ошибки, предупреждения, происходящие во время работы приложения
  • «Monitors» - отображает статистику использования памяти, процессора, сети и видео.

Для мониторинга утечки достаточно следить за потреблением памяти и работой GC.



Если потребление памяти растёт, а GC очищает память с каждым разом всё меньше - вероятно в приложении есть утечка памяти.


Дампы памяти.

Позволяют определить утечку более точно.

Дампы удобно делать сразу после того как отработал GC, наблюдаем за этим во вкладке «logcat». Пример срабатывания GC на скриншоте:


Пошагово получается примерно так:
  1. Запускаем приложение – делаем дамп памяти
  2. Сработал GC – делаем дамп памяти
  3. Сработал GC – делаем дамп памяти
Или
  1. Запускаем приложение – делаем первый дамп памяти
  2. Ждём пока GC отработает 3-4 раза и после последнего срабатывания делаем дамп памяти
  3. Анализируем

Как сделать дамп памяти.

Открываем вкладку «Monitors» и жмём кнопку «Dump Java Heap».  Дамп создаётся в течение 10 секунд и автоматически открывается в AS


Список всех созданных дампов можно найти во вкладке «Captures».


Необходимо оставить открытыми первый дамп и последний, это позволит выявить различия в памяти.

Основная вкладка.
Эта вкладка отображает: дамп памяти, количество объектов в памяти (столбцы: «Total Count», «Heap Count»). 

Сравнив количество в первом и последнем дампах, вы выявите проблемное место.


Вкладка «Analyzer Tasks» позволяет выявить утечки памяти в Activity и найти дубликаты строк. Для запуска анализа нужно нажать на кнопку «Perform Analysis».
Если количество дубликатов растёт, то есть утечка памяти.



Дополнительно.

Для подробного мониторинга потребления памяти можно использовать кнопку «System Information» -> «Memory Usage». Нажав на неё, произойдёт выгрузка данных по состоянию выделенной памяти для приложения.


Список всех выгрузок можно найти во вкладке «Captures»

Наблюдайте за столбцами «Pss Total» и «Private Dirty»



На этом всё. Спасибо за внимание!