公告
Android Perfetto 系列 14:heapprofd 与内存 Profiling
1 | SELECT name, idx, severity, source, value |
推出报告前检查
采集条件:
- 本文的采集流程以 Android 12–17 为范围;Java allocation sampling 需要 Android 12 或更高版本。
- user build 上用 adb / shell 抓目标 App,通常需要
debuggable或。 - 按 PID 抓运行中进程可能错过启动早期分配;按进程名等待启动能覆盖更多启动阶段。
- runtime profiling 不是立刻生效,目标进程很空闲时,下一波分配前可能还没启用。
- 同一个目标进程同时只能被一个相关 session profile;冲突时先确认是否有旧
perfettosession。
统计结果可信度:
- heapprofd stats、stackprofile stats、symbolization stats 必须过一遍;命中 overrun、non-finalized、unknown symbols 时降级。
- heapprofd 数字和 RSS 对不上很常见,碎片、线程缓存、allocator cache、ZRAM 都会造成差异。
结论边界:
Total malloc size高不等于泄漏,先和Unreleased malloc size、连续 diamond、业务操作时间点一起看。- 图形 backing 高不等于 heapprofd 一定高。Graphics/GL、dmabuf、GPU、Surface buffer 要单独成账。
- 把结论归类为
leak / peak / cache / churn / out-of-scope graphics memory / evidence insufficient,每类对应不同下一步动作。
把内存风向落到调用栈
报告里先列内存风向,再列 heapprofd 的采样条件、未释放分配和调用栈。如果上涨主要来自 GraphicBuffer、dma-buf 或 GPU texture,就改用图形内存证据,不能把 heapprofd 的空结果写成「没有内存状况」。
实战里可以按这个顺序走:
- 用 process stats、meminfo、smaps 或线上监控确认内存趋势。
- 如果上升落在 Native Heap / malloc wrapper / heapprofd 可见 allocator 路径,进入 heapprofd;如果只是 RSS/PSS 涨,先用 smaps_rollup、meminfo 分类、mmap/syscall 或 dmabuf/graphics 证据拆账。
- 在 UI 里看 Unreleased malloc size 和 flamegraph。
- 用 SQL 找大头,再回到 flamegraph 看完整调用栈。
- 补符号化、写清采样条件和可信度。
- 把结论归类为 leak、peak、cache、churn、图形内存账外问题或证据不足。
参考文档
- Memory: Callstack-based Allocation Profiling
- Memory: Java heap dumps
- Memory counters and events
- heapprofd design
- TraceConfig reference
- Track Events
- Android Log data source
- ProfilingManager
- Android Profiling module
源码核对版本:b23c67be1159e3f0b0657bd97be9e139e0d8ee2c(2026-09-19)。
- heapprofd 增量导入实现
- Heap summary tree 聚合实现
关于我 && 博客
欢迎关注 Android efficiency。
本文由News整理发布,仅供参考。
评论加载中…

