1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| duration_ms: 15000
buffers { size_kb: 131072 fill_policy: DISCARD } # 0: heapprofd buffers { size_kb: 32768 fill_policy: RING_BUFFER } # 1: system context
data_sources { config { name: "linux.process_stats" target_buffer: 1 process_stats_config { scan_all_processes_on_start: true proc_stats_poll_ms: 1000 } } }
data_sources { config { name: "linux.sys_stats" target_buffer: 1 sys_stats_config { meminfo_period_ms: 1000 meminfo_counters: MEMINFO_MEM_AVAILABLE meminfo_counters: MEMINFO_CACHED meminfo_counters: MEMINFO_SWAP_FREE meminfo_counters: MEMINFO_ZRAM vmstat_period_ms: 1000 vmstat_counters: VMSTAT_PGFAULT vmstat_counters: VMSTAT_PGMAJFAULT vmstat_counters: VMSTAT_OOM_KILL } } }
data_sources { config { name: "linux.ftrace" target_buffer: 1 ftrace_config { ftrace_events: "sched/sched_switch" ftrace_events: "sched/sched_waking" atrace_categories: "am" atrace_categories: "view" atrace_apps: "com.example.app" } } }
data_sources { config { name: "track_event" target_buffer: 1 track_event_config { disabled_categories: "*" enabled_categories: "memory" enabled_categories: "app" } } producer_name_filter: "com.example.app" }
data_sources { config { name: "android.heapprofd" target_buffer: 0 heapprofd_config { sampling_interval_bytes: 4096 process_cmdline: "com.example.app" continuous_dump_config { dump_phase_ms: 5000 dump_interval_ms: 5000 } shmem_size_bytes: 8388608 block_client: false max_heapprofd_memory_kb: 262144 max_heapprofd_cpu_secs: 30 } } }
|
这仍然是 native heap 模板,不是图形内存模板。排查 GraphicBuffer、dma-buf、GPU texture、Surface buffer 时,要额外对照 dmabuf、GPU/graphics 计数、dumpsys meminfo Graphics/GL、SurfaceFlinger layer / buffer 信息;heapprofd 只能回答 malloc/new 侧有没有对应贡献。
heapprofd buffer 使用 DISCARD 时,buffer 必须足够大。heap profile 常在 dump 点集中写入,DISCARD 满后会丢新数字,对末尾 diamond 和未释放大头很危险。抓完必须检查 traced_buf_chunks_discarded、heapprofd_* stats;长 Trace 或写入量不确定时,优先给 heapprofd 独立大 buffer,必要时改 RING 并在报告里說明旧 dump 可能被覆盖。
临时排查时,直接把 PBTX 通过 stdin 传给 perfetto 最稳。输出路径在 Android 上放到 /data/misc/perfetto-traces/:
1 2 3
| adb push config.pbtx /data/local/tmp/config.pbtx adb shell 'cat /data/local/tmp/config.pbtx | perfetto -c - --txt -o /data/misc/perfetto-traces/heap.pftrace' adb pull /data/misc/perfetto-traces/heap.pftrace .
|
手写 HeapprofdConfig 和 tools/heap_profile 的默认行为不完全一样。block_client 可以在 heapprofd shared memory 满时阻塞目的進程,换取统计结果完整性;脚本的 --block-client 是默认行为,但手写配置需要自己决定。
生成文章海報 / 分享 QR Code