从测试设备检索配置文件或从后端下载配置文件后,您可以在 Perfetto 界面中打开该文件,以检查时间轴、线程状态和内存保留图。本页面介绍了如何浏览使用 ProfilingManager 捕获的经过隐去处理的系统跟踪记录和 Java 堆转储。
直观呈现系统跟踪记录
在 Perfetto 界面中打开 .perfetto-trace 文件,以检查一段时间内的 CPU 和线程活动。
为了保护用户隐私,ProfilingManager 会将所有其他进程的 CPU 活动合并到单个 OtherProcesses 轨道中,从而对系统跟踪记录进行隐去处理。
通过检查此组合轨道,您仍然可以确定应用运行缓慢是由内部瓶颈还是整体设备负载造成的。
图 2 突出显示了经过隐去处理的系统跟踪记录的主要部分:
- CPU 列表:显示设备上所有可用的处理器。
- CPU 任务:显示每个 CPU 正在执行哪些线程。
- 其他进程视图:显示其他进程消耗的 CPU 资源。
- Process View:显示应用的进程。
- Threads View:显示在进程中运行的线程及其线程状态(可运行 (R)、正在运行 (R)、休眠 (S)、不可中断休眠 (D)),这些状态直接映射到 Linux 进程状态。
- 跟踪切片:此部分显示由应用开发者或框架添加的跟踪注释。这些注解涵盖
Trace.beginSection和Trace.endSection之间的计算。
如需详细了解 Perfetto 界面和跟踪记录可视化,请参阅 Perfetto 文档。
直观呈现 Java 堆转储
使用 PROFILING_TYPE_JAVA_HEAP_DUMP 捕获 Java 堆转储后,在 Perfetto 界面中打开生成的 .perfetto-java-heap-dump 文件,以找出内存泄漏问题或优化内存用量。在 Heapdump Explorer 中,您可以浏览堆图,检查累积对象大小的火焰图,以及浏览类、对象和支配项,如图 3 所示。
ProfilingManager 堆转储与 HPROF 转储的区别
与标准 .hprof 堆转储(例如使用 Debug.dumpHprofData 或在 Android Studio 中捕获的堆转储)不同,ProfilingManager 会捕获 Perfetto ART 堆转储 (.perfetto-java-heap-dump)。ProfilingManager 不会转储原始内存内容,而是会记录对象保留图和大小元数据,同时省略存储在对象内的原始数据:
- 收集的内容:
- 类和类型:类名称、父类层次结构、类加载器、实例大小和引用类型(例如普通类、数组、字符串或弱引用、软引用、终结器引用和虚引用)。
- 对象实例和大小:每个对象的浅层大小 (
self_size)、其堆区域(HEAP_TYPE_APP、HEAP_TYPE_ZYGOTE或HEAP_TYPE_BOOT_IMAGE)以及通过NativeAllocationRegistry注册的相关原生内存。 - 引用和 GC 根:垃圾回收根(例如 JNI 全局和局部变量、Java 堆栈帧和线程对象)以及字段级引用链,显示哪个对象保留了另一个对象以及通过哪个字段名称保留。
- 选择大小调整元数据:特定框架类型的非敏感元数据,例如
Bitmap维度(mWidth和mHeight)。
- 省略的内容:实际基元字段值、
String字符内容和原始数组载荷(byte[]、char[]和其他基元数组)。省略原始对象内容可保护生产设备上的用户隐私,并使转储文件显著变小。
后续步骤
除了在 Perfetto 界面中进行直观检查之外,您还可以使用 PerfettoSQL 查询配置文件、批量分析跟踪记录或使用 AI 分析配置文件。