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

Трассировка системы — это мощный профиль, содержащий информацию о процессах, потоках, синхронизации, выполнении ЦП и задач, а также системных или пользовательских событиях.
С точки зрения приложения характер информации в трассировках может охватывать широкий спектр областей, включая задержку, подтормаживания, память, батарею и многое другое.
Системные трассировки содержат следующие события, управляемые кодом, которые могут быть как системными, так и определяемыми пользователем. События, управляемые кодом, — это события, которые пользователи могут инициировать посредством вызовов функций.
- Срезы трассировки: отображают время между различными точками кода. Их можно добавить с помощью API
Trace.beginSection
иTrace.endSection
. - Счётчики трассировки: числовые значения, представляющие метрики, например, размер кучи. Их можно добавить с помощью API
Trace.setCounter
.
Системные трассировки также содержат метрики, которые можно создавать из запросов PerfettoSQL и использовать для проведения анализа или сравнения трассировок.
Мы рекомендуем использовать системные трассировки для выполнения следующих задач:
Диагностируйте проблемы с задержками. Системные трассировки отлично подходят для выявления проблем с задержками, вызванных задержками, ожиданием или проблемами планирования. Другие профилировщики, например, профили на основе выборок, не предоставляют такую же информацию о времени выполнения, как системные трассировки.
Найдите дублирующиеся вычисления. Трассировка может выявить повторение некоторых вычислений, что может указывать на ненужные операции.
Диагностируйте проблемы, связанные с конфликтами блокировок. Информация о состояниях потоков и фрагментах, показывающих, когда ресурсы заблокированы, позволяет определить, вызывают ли блокировки (например,
synchronized
блоки) задержки в работе пользователей.Разберитесь в многопоточности вашего приложения. Трассировки предоставляют представление о нескольких потоках, отображая состояние каждого потока и любые фрагменты трассировки, добавленные системой или вашим приложением. Это многопоточное представление помогает понять, какие потоки активны, находятся в спящем режиме или что они выполняют, и как они взаимодействуют.
Выполняйте комплексный анализ производительности. Мощный пользовательский интерфейс и возможность отображения различных типов информации делают трассировки системы полезными для отладки широкого спектра проблем с производительностью, включая задержки, использование памяти и батареи.
Системные трассировки также поддерживают запросы с использованием PerfettoSQL . Эта мощная функция позволяет:
- Извлечение конкретных данных.
- Преобразуйте данные трассировки в пользовательские метрики.
- Создавайте отладочные треки из запросов, чтобы упростить визуализацию наиболее важных для вас вещей в пользовательском интерфейсе Perfetto.
- Выполняйте сложный анализ непосредственно в пользовательском интерфейсе Perfetto.
Профили образцов стека

Профили выборки стека работают путем записи выборок выполнения кода и сохранения информации о стеке вызовов с заданной частотой, пока поток выполняет задачи на ЦП. Это позволяет понять, что делает ваш код во время выполнения.
Мы рекомендуем использовать образцы стека для следующих целей:
- Оптимизируйте активные точки. Выборки стека помогают определить части кода с высокой нагрузкой на процессор, то есть поток часто находится в состоянии «выполняется».
- Понимание выполнения кода. Примеры стека помогут вам понять общее поведение вашей кодовой базы.
- Определите код, который не должен запускаться. Вы можете обнаружить стеки вызовов, которые вообще не должны запускаться, что указывает на возможности для немедленной оптимизации.
Кучевые свалки

Дампы кучи Java представляют собой снимок памяти кучи Java вашего приложения. Этот снимок включает все объекты и их взаимосвязи на момент создания дампа.
Мы рекомендуем собирать дампы кучи, чтобы сделать следующее:
- Выявляйте дублирующиеся объекты. Дампы кучи показывают количество активных объектов, что полезно для отслеживания дублирующихся объектов. Они также содержат ссылки на объекты, помогая определить место в коде, где они были созданы.
- Найдите утечки памяти. Дампы кучи могут выявить память, которая не должна была использоваться на момент создания дампа, что указывает на потенциальные утечки памяти.
- Определите объекты, которые можно оптимизировать. Отображая объекты, использующие большой объём памяти, и их количество, дампы кучи помогают выявить неэффективные схемы использования памяти.
Профили кучи

Профили кучи доступны как в нативной версии, так и в версии Java и отлично подходят для отладки проблем с памятью. Они похожи на выборки стека вызовов, но вместо измерения циклов ЦП они делают выборки при выделении памяти.
Мы рекомендуем использовать профили кучи для достижения следующих целей:
- Уменьшите перераспределение памяти. Профили кучи предоставляют примеры участков кода для выделения памяти. Это помогает выявить области, создающие множество временных объектов, которые могут способствовать частым сборам мусора (GC) в вашем приложении.
- Выявляйте утечки памяти. Профили кучи можно использовать вместе с другими профилями памяти для диагностики и устранения утечек. Они помогают определить области, которые выделяют значительно больше памяти, чем ожидалось.
Объединить профили
Зачастую для анализа производительности используется один профиль. Однако сбор нескольких профилей или одного комбинированного профиля зачастую позволяет получить более полную картину и помогает диагностировать сложные проблемы, которые невозможно решить с помощью одного профиля.
Рассмотрим следующие сценарии, в которых объединение профилей может быть полезным:
Сценарий 1: Исследование неинструментированного кода. Трассировка системы может показать задержку для операций, которые вы уже инструментировали. Однако вам может потребоваться дополнительная информация о неинструментированных частях кода, работающих в это время. Для исследования создайте профиль стека вызовов, чтобы понять выполняемый код. Эта информация поможет вам улучшить трассировку, добавив дополнительные фрагменты трассировки.
Сценарий 2: Анализ утечек памяти и сборок мусора. Представьте, что трассировка системы показывает постоянное увеличение объёма кучи Java из-за выделения памяти, что приводит к частым сборам мусора (GC). Чтобы понять, какие объекты выделяются, создайте профиль кучи или дамп кучи. Этот комбинированный подход поможет вам найти способы снижения потребления памяти. Например, сокращение непроизводительных или оптимизируемых выделений памяти с помощью кэширования может предотвратить выполнение GC.