Memory Leaks aka Heap Dumps

Описание HeapDumpConfiguration

HeapDumpConfiguration – плагин, предназначенный для анализа утечек памяти в приложении. Чем полезны heap dump-s? Путем анализа их содержимого можно выявить объекты, которые не были корректно удалены из памяти, и определить причину утечки.

Плагин отслеживает Out Of Memory (OOM) ошибки и, если ваше приложение падает с OOM, в момент обнаружения ошибки собирает дамп кучи. Затем происходит пересборка дампа с предварительной очисткой от контента и приватных данных. Когда приложение не используется, дамп в фоне отправляется на бэкенд, где и анализируется на предмет утечек при помощи LeakCanary Shark. Стоит заметить, что поиск направлен только на тривиальные утечки: Activity, Fragment, Service и т.д.

ВАЖНО! Пересборка и анализ heap dump-ов происходит, когда устройством никто не пользуется. Именно поэтому все отчёты генерируются и отправляются ночью.

Сгенерированный отчёт можно найти в разделе «Сбои», указав нужную дату и выбрав тип MEMORY LEAK. В самом отчёте содержится информация о приложении и об устройстве, на котором оно было запущено, сводка по обнаруженным утечкам и их размеру, а также данные о самих объектах, спровоцировавших утечку:

Важно понимать, что количество утечек, указанное в отчёте, может оказаться существенно меньше реальной величины. Процессинг heap dump-ов занимает продолжительное время, и Tracer может принимать не больше 500 дампов в день, из-за чего количество утечек, которые попадают в MEMORY LEAK, ограничено. Иногда на диске пользователя может оказаться недостаточно места для хранения полного дампа до его процессинга, поэтому не каждый OOM крэш сопровождается дампом на сервере Tracer. В связи с этим не стоит сранивать MEMORY LEAK по количеству с другими типами ошибок – только между собой.

Для обнаружения специфичных ситуаций и нетривиальных утечек, с которыми не может справиться Shark, существует инструмент «Утечки памяти». Здесь хранятся первые 100 heap dump-ов вашего проекта за выбранный период, и возможно наглядно соотнести размер выведенного дампа и количество найденных утечек. Рекомендуется обращать внимание на дампы с максимальным размером и минимальным количеством утечек, ведь проблема может крыться и в бизнес-логике приложения, к которой плагин не имеет доступа:

Отчёт об утечках содержит данные о приложении и об устройстве, на котором оно было запущено, и предоставляет сводку по обнаруженным утечкам, их размеру, количеству и объектах, спровоцировавших утечку:

При необходимости вы можете скачать дамп, чтобы исследовать его с помощью программ для анализа Java heap dump-ов. Мы рекомендуем пользоваться Android Studio или VisualVM.

Таким образом, плагин позволяет обнаружить и исправить различные проблемы, связанные с управлением памятью в вашем приложении, а в перспективе – оптимизировать использование памяти и производительность приложения в целом.

Подключение зависимостей к проекту

В вашем <project>/<app-module>/build.gradle.kts:

dependencies { implementation("ru.ok.tracer:tracer-heap-dumps:0.2.13") }

Более подробное описание зависимостей на странице Быстрый старт

Конфигурация HeapDumpConfiguration

На данный момент в HeapDumpConfiguration есть только один активный параметр, отвечающий за его работу. Настроить его можно при помощи опции HeapDumpConfiguration.Builder:

ОпцияОписание
setEnabledОтвечает за включение/выключение сбора heap dump-ов при OOM. По умолчанию включён

В HeapDumpConfiguration.Builder также есть устаревшие опции, использование которых не рекомендуется для корректной работы плагина:

  • setProbability
  • setInterestingSize

Удаление этих опций произойдет в версии 0.3.x.