本讲是Android Camera性能分析专题的第49讲,我们介绍Perfetto内存分析之使用Perfetto来分析Native Heap。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
如何查看某个进程的Native Heap用量
可以执行:
dumpsys meminfo [pid/pkg]
下图是高通Camera HAL的预览过程中的meminfo
Heapprofd简介
Heapprofd 通过Hook malloc/free 和 C++ 的 operator new/delete 调用来对Heap分配进行采样。给定一个 n 字节的采样间隔,平均每分配 n 字节就会对一个分配进行采样。默认的采样率是 4096 字节。
哪些进程是Profileable的
不同Android版本,各进程能否被Profile情况
Critical native service定义在heapprofd.te中
App进程标记为profileable
Heapprofd配置文件说明
参考:https://s.deepinout.com/android-14.0.0_r2/xref/external/perfetto/protos/perfetto/config/profiling/heapprofd_config.proto
常用的配置
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实战分析
- 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对齐 | √ |