首页 > 技术 > 正文

Android Perfetto 系列 14:heapprofd 与内存 Profiling

2026-10-30  ·  阅读:170
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT name, idx, severity, source, value
FROM stats
WHERE value != 0
AND (
name GLOB 'heapprofd_*'
OR name GLOB 'stackprofile_*'
OR name GLOB 'symbolization_*'
OR name IN (
'symbolization_tmp_build_id_not_found',
'heapprofd_buffer_overran',
'heapprofd_buffer_corrupted',
'heapprofd_client_error',
'heapprofd_missing_packet',
'heapprofd_non_finalized_profile',
'heapprofd_rejected_concurrent',
'heapprofd_hit_guardrail',
'heapprofd_sampling_interval_adjusted',
'heapprofd_client_spinlock_blocked'
)
)
ORDER BY name, idx;

发布报告前检查

采集条件:

  • 本文的采集流程以 Android 12–17 为范围;Java allocation sampling 需要 Android 12 或更高版本。
  • user build 上用 adb / shell 抓目标 App,通常需要 debuggable 或 。
  • 按 PID 抓运行中进程可能错过启动早期分配;按进程名等待启动能覆盖更多启动阶段。
  • runtime profiling 不是立刻生效,目标进程很空闲时,下一波分配前可能还没启用。
  • 同一个目标进程同时只能被一个相关 session profile;冲突时先确认是否有旧 perfetto session。

统计结果可信度:

  • 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 的空结果写成「没有内存状况」。

实战里可以按这个顺序走:

  1. 用 process stats、meminfo、smaps 或线上监控确认内存走向。
  2. 如果增长落在 Native Heap / malloc wrapper / heapprofd 可见 allocator 路径,进入 heapprofd;如果只是 RSS/PSS 涨,先用 smaps_rollup、meminfo 分类、mmap/syscall 或 dmabuf/graphics 证据拆账。
  3. 在 UI 里看 Unreleased malloc size 和 flamegraph。
  4. 用 SQL 找大头,再回到 flamegraph 看完整调用栈。
  5. 补符号化、写清采样条件和可信度。
  6. 把结论归类为 leak、peak、cache、churn、图形内存账外问题或证据不足。

参考文档

  1. Memory: Callstack-based Allocation Profiling
  2. Memory: Java heap dumps
  3. Memory counters and events
  4. heapprofd design
  5. TraceConfig reference
  6. Track Events
  7. Android Log data source
  8. ProfilingManager
  9. Android Profiling module

源码核对版本:b23c67be1159e3f0b0657bd97be9e139e0d8ee2c(2026-09-19)。

  • heapprofd 增量导入实现
  • Heap summary tree 聚合实现

关于我 && 博客

欢迎关注 Android efficiency。

本文由News整理发布,仅供参考。

12345678
评论加载中…

友情链接申请友链

联盟矩阵53