Под нативной памятью понимаются выделения памяти, выполняемые в коде на C, C++ или Rust с использованием таких функций, как malloc , free , или операторов, таких как new и delete . В отличие от Java, нативная память не подвергается автоматической сборке мусора; вы сами отвечаете за управление жизненным циклом каждого выделенного блока памяти.
Профилирование с помощью heapprofd
heapprofd — это встроенный профилировщик кучи для Android, работающий на уровне всей платформы. Он использует подход, основанный на выборке, для записи выделений и освобождений памяти с минимальными накладными расходами.
Использование инструмента heap_profile
Самый простой способ получить собственный профиль кучи — использовать скрипт heap_profile , предоставляемый Perfetto.
Загрузите скрипт из репозитория Perfetto:
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/heap_profile chmod +x heap_profileУбедитесь, что ваше устройство подключено через ADB, и запустите инструмент, указав целевой процесс:
./heap_profile -n <package_name_or_process_name>Проанализируйте пользовательский сценарий в вашем приложении.
Остановите профилировщик (Ctrl+C). Скрипт автоматически загрузит профиль, запустит локальный сервер
pprofи откроет ваш веб-браузер для просмотра графика пламени.
Запуск создания снимков
Также можно инициировать дамп текущего состояния кучи во время выполнения трассировки Perfetto:
adb shell killall -USR1 heapprofd
Это создаст снимок (значок в виде ромба) в пользовательском интерфейсе Perfetto. Используйте пример конфигурации heapprofd подобный этому:
buffers: {
size_kb: 65536
}
data_sources: {
config {
name: "android.heapprofd"
heapprofd_config {
sampling_interval_bytes: 4096
process_cmdline: "com.example.myapp"
}
}
}
duration_ms: 20000
Анализ с помощью pprof
Результатом работы heapprofd является набор файлов .pb.gz . Если вы использовали скрипт heap_profile , эти файлы автоматически загружаются во временный каталог вашей хост-машины (например, /tmp/heap_profile-XXXXXX в Linux или macOS), и создается удобная символическая ссылка по адресу /tmp/heap_profile-latest .
См. также: Запись профилей памяти с помощью Perfetto
Вы можете вручную проанализировать эти файлы с помощью pprof, инструмента для визуализации и анализа данных профилирования.
Просмотр пламенных графиков
Загрузите свой профиль в программу для просмотра pprof например, Google pprof, доступную на GitHub .

- Неосвобожденная память : Найдите выделенные области памяти, которые были выделены, но так и не были освобождены. Диаграмма стека вызовов покажет, какие стеки вызовов отвечают за наибольшее количество неосвобожденных байтов.
- Общее количество выделенных ресурсов : Вы также можете просмотреть общее количество выделенных байтов за весь период профилирования, что полезно для отслеживания изменений в выделении ресурсов в нативном коде.
PerfettoSQL для нативных профилей кучи
Если вы получили профиль нативной кучи в полной трассировке Perfetto (используя heapprofd ), вы можете запросить данные о выделении памяти. Это полезно для подсчета объектов или суммирования байтов:
SELECT
upid,
count(id) AS allocation_count,
sum(size) AS total_bytes
FROM heap_profile_allocation
GROUP BY upid
ORDER BY total_bytes DESC;
Вы также можете просмотреть общее количество выделенных байтов во время профилирования, даже если они впоследствии были освобождены. Это полезно для выявления «изменения в распределении ресурсов».
Символизация
Если на вашем графике пламени отображаются «неизвестные» кадры, вам необходимо символизировать профиль. Для этого требуется предоставить необработанные версии ваших нативных библиотек (файлы .so с отладочными символами).
Где найти символы в AOSP: Символы генерируются в процессе сборки и хранятся по адресу: out/target/product/<device_name>/symbols/
Используйте флаг --sym-dir с инструментом heap_profile :
./heap_profile -n <process> --sym-dir <path-to-unstripped-symbols>
Анализ графики и DMA-BUF
На современных устройствах под управлением Android значительная часть памяти часто используется графическими буферами, известными как DMA-BUF . Они используются для слоев пользовательского интерфейса, кадров с камеры и видеобуферов.
Поскольку DMA-BUF используются совместно несколькими процессами (например, вашим приложением и службой surfaceflinger или камерой), отслеживать их может быть сложно. Инструмент dmabuf_dump сообщает обо всех процессах, использующих DMA-BUF.
← Растровые изображения | ↑ Вверх | WebView →