本讲是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定义在中
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 /data/local/tmp/heap.txt
- 通常这里记录的内存使用量比heapprofd记录的要大,主要取决于allocator是否会马上释放内存,以jemalloc为例,在thread中会cache一会儿freed的内存
heap rss
- 从操作系统角度看申请了多少内存,执行如下命令可以查看
adb shell dumpsys meminfo
- 通常比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对齐 | √ |