第49讲 Perfetto 内存分析之分析Native Heap

本讲是Android Camera性能分析专题的第49讲,我们介绍Perfetto内存分析之使用Perfetto来分析Native Heap。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera
星球ID: 17296815
Wechat 极客笔记圈

如何查看某个进程的Native Heap用量

可以执行:

dumpsys meminfo [pid/pkg]

下图是高通Camera HAL的预览过程中的meminfo

如何查看某个进程的Native Heap用量

Heapprofd简介

Heapprofd 通过Hook malloc/free 和 C++ 的 operator new/delete 调用来对Heap分配进行采样。给定一个 n 字节的采样间隔,平均每分配 n 字节就会对一个分配进行采样。默认的采样率是 4096 字节。

Heapprofd简介

哪些进程是Profileable的

不同Android版本,各进程能否被Profile情况

哪些进程是Profileable的

Critical native service定义在heapprofd.te

App进程标记为profileable
哪些进程是Profileable的

Heapprofd配置文件说明

参考:https://s.deepinout.com/android-14.0.0_r2/xref/external/perfetto/protos/perfetto/config/profiling/heapprofd_config.proto

常用的配置

Heapprofd配置文件说明

Field Description
process_cmdline 想profile的cmdline
pid 想profile的PID
sampling_interval_bytes 采样的字节间隔,每隔多少字节采样一次,默认4096
shmem_size_bytes Profiled进程和heapprofd之间的共享内存大小,默认8MB,最大500MB
block_client 当shmem buffer满了后,不停止trace而是block住client
no_startup 不要profile开始运行的进程,Only match processes on startup,与no_running互斥。
no_running 不要profile正在运行的进程,Only match processes on startup,与no_startup互斥。

ContinuousDumpConfig如下

Field Description
dump_phase_ms 第一次dump等待的时间
dump_interval_ms 两次dump之间的时间间隔

如何按需主动触发一次dump

除了continuous dump外,我们可以在profile过程中主动触发dump,执行

adb shell killall -USR1 heapprofd

应用场景:
想记录特定场景/时刻,某进程的内存情况,比如在自动化测试中,拍照结束后马上出发一次dump

Heapprofd dump实战分析

Heapprofd dump实战分析

  • Unreleased malloc size: 申请未释放的buffer大小
  • Unreleased malloc count:申请未释放的malloc次数
  • Total malloc size:总的申请buffer大小(包括已释放的)
  • Total malloc count:总的申请buffer次数(包括已释放的)

Heapprofd vs malloc_info() vs RSS

Heapprofd

  • C/C++内存分配角度(malloc/new)记录内存的使用情况

Malloc_info

  • 从分配器(allocator)角度记录内存的使用情况,userdebug 通过如下命令抓取(App进程)
am dumpheap -m <PID> /data/local/tmp/heap.txt
  • 通常这里记录的内存使用量比Heapprofd记录的要大,主要取决于allocator是否会马上释放内存,以jemalloc为例,在thread中会cache一会儿freed的内存

Heap RSS

  • 从操作系统角度看申请了多少内存,执行如下命令可以查看
adb shell dumpsys meminfo <PID>
  • 通常比Heapprofd和Malloc_info要大一点,因为一般实际申请内存会按照Page对齐要求
  • 在支持ZRAM的平台,也可能会出现比Heapprofd和Malloc_info要小一点,因为内存被swap到ZRAM去了

三者的关系

A heapprofd malloc_info RSS
from native startup
After zygote init process
Before zygote init process
Thread caches
Page对齐

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera性能分析