Анализ собственной памяти

Под нативной памятью понимаются выделения памяти, выполняемые в коде на C, C++ или Rust с использованием таких функций, как malloc , free , или операторов, таких как new и delete . В отличие от Java, нативная память не подвергается автоматической сборке мусора; вы сами отвечаете за управление жизненным циклом каждого выделенного блока памяти.

Профилирование с помощью heapprofd

heapprofd — это встроенный профилировщик кучи для Android, работающий на уровне всей платформы. Он использует подход, основанный на выборке, для записи выделений и освобождений памяти с минимальными накладными расходами.

Использование инструмента heap_profile

Самый простой способ получить собственный профиль кучи — использовать скрипт heap_profile , предоставляемый Perfetto.

  1. Загрузите скрипт из репозитория Perfetto:

    curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/heap_profile
    chmod +x heap_profile
    
  2. Убедитесь, что ваше устройство подключено через ADB, и запустите инструмент, указав целевой процесс:

    ./heap_profile -n <package_name_or_process_name>
    
  3. Проанализируйте пользовательский сценарий в вашем приложении.

  4. Остановите профилировщик (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 .

График активности кучи, показывающий размер невыделенного выделения памяти для com.android.memorylab

  • Неосвобожденная память : Найдите выделенные области памяти, которые были выделены, но так и не были освобождены. Диаграмма стека вызовов покажет, какие стеки вызовов отвечают за наибольшее количество неосвобожденных байтов.
  • Общее количество выделенных ресурсов : Вы также можете просмотреть общее количество выделенных байтов за весь период профилирования, что полезно для отслеживания изменений в выделении ресурсов в нативном коде.

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 →