您可以在 Android 中记录多种类型的性能分析报告。收集分析报告有助于您调试与应用运行速度、内存用量、耗电量等相关的问题。
本文档介绍了最有用的分析报告类型,以及何时使用每种分析报告 来调试常见的性能问题。
系统跟踪记录
系统跟踪记录是一种功能强大的分析报告,其中包含有关进程、 线程、时间信息、CPU 和任务执行以及系统或用户定义的 事件的信息。
从应用的角度来看,跟踪记录中的信息性质可能涵盖广泛的 领域,包括延迟时间、卡顿、内存、电池等。
系统跟踪记录包含以下代码驱动的事件,这些事件可以是系统 或用户定义的。代码驱动的事件是指用户可以通过 函数调用触发的事件。
- 跟踪记录切片:表示代码中不同点之间的时间。可以使用
Trace.beginSection和Trace.endSectionAPI 添加它们。 - 跟踪记录计数器:表示指标的数值,例如堆
大小。可以使用
Trace.setCounterAPI 添加它们。
系统跟踪记录还包含可以从 PerfettoSQL 查询创建的指标 ,这些指标可用于执行分析或比较跟踪记录。
我们建议使用系统跟踪记录来执行以下任务:
诊断延迟时间问题。系统跟踪记录非常适合查找 由延迟、等待或调度问题引起的延迟时间问题。其他 分析器(例如基于样本的分析报告)不提供系统跟踪记录提供的时间信息 。
查找重复的计算。跟踪记录可以显示某些计算 是否重复执行,这可能表明存在不必要的操作。
诊断锁争用问题。借助有关线程状态的信息 以及显示资源何时被阻塞的切片,您可以确定锁 (例如
synchronized块)是否导致用户历程出现延迟。了解应用中的多线程。 跟踪记录提供了多个 线程的视图,显示了每个线程的状态以及系统或应用添加的任何跟踪记录切片。这种多线程视图有助于您了解哪些 线程处于活跃状态、休眠状态,或者它们正在运行什么以及如何 交互。
执行复杂的性能分析。功能强大的界面以及 显示各种类型信息的能力使系统跟踪记录 可用于调试各种性能问题,包括延迟时间、 内存和电池用量。
系统跟踪记录还支持使用 PerfettoSQL 进行查询。借助这项强大的 功能,您可以:
- 提取特定数据。
- 将跟踪记录数据转换为自定义指标。
- 根据查询创建调试轨道,以便在 Perfetto 界面中更轻松地直观呈现您最关心的内容 。
- 直接在 Perfetto 界面中执行复杂的分析。
堆栈样本分析报告
堆栈样本分析报告的工作原理是,在线程在 CPU 上运行任务时,以设定的速率记录代码执行样本并存储 调用堆栈信息。这有助于您了解代码在执行期间执行的操作。
我们建议使用堆栈样本来执行以下操作:
- 优化热点。堆栈样本有助于识别代码中 CPU 活动较多的部分,这意味着线程通常处于“运行”状态。
- 了解代码执行。堆栈样本可以帮助您了解 代码库的整体行为。
- 识别不应运行的代码。您可能会发现根本不应运行的调用堆栈,这表明存在立即进行优化的机会。
堆转储
Java 堆转储显示了应用 Java 堆内存的快照。此快照 包含所有对象以及在进行转储时它们之间的相互引用方式 。
我们建议收集堆转储以执行以下操作:
- 发现重复的对象。堆转储显示了活跃对象的数量, 这对于跟踪重复的对象非常有用。它们还提供对象 引用,帮助您找出创建对象时所在的代码位置。
- 查找内存泄漏。堆转储可以显示在进行转储时不应再 使用的内存,这表明可能存在内存泄漏。
- 识别可以优化的对象。通过显示使用大量内存的对象及其计数,堆转储有助于识别低效的内存使用模式。
堆分析报告
堆分析报告有原生版本和 Java 版本,非常适合 调试内存问题。它们与调用堆栈样本类似,但它们不是 测量 CPU 周期,而是在分配内存时进行采样。
我们建议使用堆分析报告来完成以下操作:
- 减少内存流失。堆分析报告提供包含内存分配代码位置的样本 。这有助于您识别创建许多 临时对象的区域,这些区域可能会导致应用中频繁发生垃圾回收 (GC)。
- 发现内存泄漏。堆分析报告可以与其他内存 分析报告结合使用,以诊断和修复内存泄漏。它们有助于您找出分配的内存量远超预期的位置 。
组合分析报告
通常,您将使用单个分析报告来分析性能。但是,收集 多个分析报告或单个组合分析报告通常可以提供更完整的 视图,并有助于诊断单个分析报告无法解决的复杂问题。
请考虑以下组合分析报告有益的场景:
场景 1:调查未插桩的代码。系统跟踪记录可能会显示 您已插桩的操作的延迟时间。但是,您可能需要 更多有关在这些时间运行的未插桩代码部分的信息。如需进行调查,请获取调用堆栈分析报告以了解 执行的代码。然后,这些信息可以帮助您通过 添加更多跟踪记录切片来改进跟踪记录。
场景 2:分析内存泄漏和垃圾回收。假设系统跟踪记录显示,由于分配,Java 堆内存不断增加,从而触发频繁的垃圾回收 (GC)。如需了解 分配的对象,请获取堆分析报告或堆转储。这种组合 方法有助于您找出减少内存用量的方法。例如, 使用缓存减少浪费或可优化的分配可能会阻止 GC 的发生。