HarmonyOS Developer DevEco Studio使用指南-性能分析
分析HarmonyOS应用/服务的内存使用
Profiler性能分析器支持内存使用分析。应用/服务运行时,Profiler的内存分析器实时显示内存使用情况,同时也支持捕获堆转储,跟踪内存分配,帮助开发者识别可能会导致应用卡顿、冻结的内存泄漏和内存抖动。
查看HarmonyOS应用/服务内存实时变化
录制HarmonyOS应用或服务的内存使用数据,需要将待分析的应用或服务运行起来,当前仅支持本地真机。
- 在DevEco Studio菜单栏上单击View>Tool Windows>Profiler,或者在DevEco Studio底部工具栏单击Profiler按钮,打开Profiler分析器。在Profiler分析器的SESSIONS窗口,单击+按钮,在弹出下拉列表中先选择设备,然后选择待分析的进程。
Profiler将自动生成包括MEMORY在内的各项性能使用情况视图,包括如下信息:
- 实时显示总内存占用的变化。
- 实时显示总内存占用的数值和悬浮框。
- 在事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件。
- 在实时变化视图,单击内存区域,进入内存详情页面。
- 内存详情页按内存类别实时显示内存变化视图,包括:
- Java:Java对象所占用的内存。
- JS:JS对象所占用的内存。
- Native:C或C++代码所占用的内存。
- Graphics:图形缓冲区队列向屏幕显示像素所使用的内存。这里是与CPU共享的内存,不是GPU专用内存。
- Stack:应用/服务中的原生堆栈和Java堆栈使用的内存。
- Code:应用/服务用于处理代码和资源的内存。
- Others:系统不确定如何分类的内存。
- Allocated:应用/服务分配的Java对象数。
捕获及分析Java堆转储
支持捕获Java堆转储,参考查看HarmonyOS应用内存实时变化,进入内存详情页面,单击工具栏中的
图标,选择 “Dump Java heap”。捕获的Java堆转储将在左侧的SESSIONS窗口对应显示,并在时间轴上对应时间段以灰色显示。
Java堆转储视图如下所示,单击①类视图下的任意一个类,会展开②实例视图,单击实例视图中的任意一个实例,会展开③引用视图。
①类视图
类列表默认显示应用分配的对象类型以及它们使用的内存数值,包括:
- Class Name:堆中分配的类名。
- Allocations:堆中的分配数。
- Native Size:此对象类型使用的原生内存总量(以字节为单位)。
- Shallow Size:此对象类型使用的Java内存总量(以字节为单位)。
- Retained Size:为此类的所有实例而保留的内存总大小(以字节为单位)。
支持按堆类型和数据组织方式筛选和排列。
- 按堆类型筛选方式如下:
○ default heap:当系统未指定堆时,使用该选项。
○ app heap:应用分配内存的主堆。
○ image heap:系统启动映像,包含启动期间预加载的类。
- 按数据组织方式:
○ Arrange by class:根据类名称对所有分配进行分组。
○ Arrange by package:根据软件包名称对所有分配进行分组。
○ Arrange by callstack:将所有分配分组到其对应的调用堆栈。只有在记录分配期间捕获堆转储时,此选项才有效。
②实例视图
在类视图中单击一个类名称,右侧将出现Instance View视图,显示该类的每个实例。每个实例包含以下信息:
- Depth:从任意GC根到选定实例的最短跳数。
- Native Size:原生内存中此实例的大小。
- Shallow Size:Java内存中此实例的大小。
- Retained Size:此实例所支配内存的大小。
③引用视图
在实例视图中,单击一个实例,下方将出现References标签页,显示对该对象的每个引用。在Instance View 和Reference视图右键选择Go to Instance可查看实例详细信息。
捕获及分析JS堆转储
支持捕获JS堆转储,参考查看HarmonyOS应用内存实时变化,进入内存详情页面,单击工具栏中的
图标,选择“Dump JS heap”。捕获的JS堆转储将在左侧的SESSIONS窗口对应显示,并在时间轴上对应时间段以灰色显示。
说明
要捕获JS方法的堆转储,应用只能以Debug模式运行。
JS堆转储视图如下所示:
单击①对象构造函数视图下的任意一个实例,会展开②实例视图,单击实例视图中的任意一个实例,会展开③引用视图。
①对象构造函数视图Constructor View
JS heap dump首先将展示Constructor View,展示对象构造函数内存信息。Constructor View支持两种视图:
- Summary View:概览视图,按照构造函数展示内存数值。
- Comparison View:对照视图,支持对任意两个内存快照进行对比,可用于查看某操作前后内存变化情况,以检测可能存在的内存泄漏。
JS heap dump默认以Summary View视图展示。Summary View视图内容包括:
- Constructor:应用中对象的构造函数,以及由该构造函数生成的对象实例数。
- Distance:此对象例到达 GC 根的最短距离。
- Shallow Size:此对象自身所占用的内存大小(以字节为单位)和百分比。
- Retained Size:此对象自身及其引用对象所占用的内存大小(以字节为单位)和百分比。
单击视图下拉框可选择切换到 Comparison View。切换后,在右侧可下拉选择需要比较的另一内存快照。Comparison View视图内容包括:
- Constructor:应用中对象的构造函数,以及由该构造函数生成的对象实例数。
- New:此内存快照相较于被比较的内存快照新增的对象数。
- Deleted:此内存快照相较于被比较的内存快照减少的对象数。
- Delta:此内存快照相较于被比较的内存快照对象数的变化。
- Allocated Size:该对象在此内存快照相较于被比较的内存快照新增的内存大小(以字节为单位)。
- Freed Size:该对象在此内存快照相较于被比较的内存快照减少的内存大小(以字节为单位)。
- Size Delta:该对象在此内存快照相较于被比较的内存快照内存大小的变化(以字节为单位)。
说明
在Constructor View中,单击
按钮,然后在搜索框中搜索“detached”,可搜索为 DOM树中已经销毁、但仍被 JS 引用的对象,这些对象可能导致 DOM 内存泄漏。
②实例视图Instance View
单击Constructor View中某一行,右侧将出现Instance View窗格,显示该对象的每个实例。Instance View各列信息含义与Constructor View一致。
③引用视图Retainer View
显示该对象实例的每个引用(由哪个属性引用,以及该属性所在的对象)的内存信息。每个对象后方有“@”+ 数字,代表对象 ID。各引用的对象实例又可以继续展开。展开时默认展开一条引用链(即展开到 GC 根)。
分析HarmonyOS应用/服务网络活动
网络活动分析器会在时间轴上显示实时网络活动,包括发送和接收的数据以及当前的连接数。通过查看网络活动,可以检查应用/服务传输数据的方式和时间,并据此进行代码优化。
录制HarmonyOS应用或服务的网络活动数据,需要将待分析的应用或服务运行起来,当前仅支持本地真机。
- 在DevEco Studio菜单栏上单击View>Tool Windows>Profiler,或者在DevEco Studio底部工具栏单击Profiler按钮,打开Profiler分析器。在Profiler分析器的SESSIONS窗口,单击+按钮,在弹出下拉列表中先选择设备,然后选择待分析的进程。
- 在实时变化视图,单击网络区域,进入网络活动详情页面。
- 在时间轴上,单击某一时刻或拖动选择某一时间段查看在该指定时刻或指定时间段的网络活动详情。
图1 查看指定时刻网络活动
图2 查看指定时间段的网络活动
①在时间轴上,单击某一时刻或拖动选择某一时间段查看在该指定时刻或指定时间段的网络活动详情。
②可以选择以下某个标签页,以详细了解时间轴上选定时段内的网络活动。
- Connection View:列出了在时间轴上选定时段内从该应用的所有CPU线程发送或接收的文件。包括大小、类型、状态和传输时长。
- Thread View:显示该应用的每个CPU线程的网络活动。
③Connection View或Thread View 单击请求名称,查看有关已发送或已接收数据的详细信息,单击各个页签可查看请求的标头和正文、响应的标头和正文或调用堆栈。
分析HarmonyOS应用/服务能耗
能耗分析器会监控 CPU、网络无线装置和 GPS 传感器的使用情况,估算设备上每项资源的耗电量,并直观地显示其中每个组件消耗的电量。能耗分析器还会显示可能会影响耗电量的系统事件(唤醒锁定、闹钟、作业和位置信息请求)的发生次数。
查看能耗概览
前提条件
待分析的应用已经运行在本地真机。
操作步骤
- 在DevEco Studio菜单栏上单击View>Tool Windows>Profiler,或者在DevEco Studio底部工具栏单击Profiler按钮,打开Profiler分析器。在Profiler分析器的SESSIONS窗口,单击+按钮,在弹出下拉列表中先选择设备,然后选择待分析的进程。
- 在实时变化视图,单击能耗区域,进入能耗概览视图。
- ①事件:显示应用中的活动事件,包括用户与设备的交互、屏幕旋转事件等。
②能耗:显示应用延时间轴的能耗估算结果。
③系统:显示可能会影响耗电量的系统事件。
检查系统事件
在能耗概览视图的时间轴上,单击某一时刻或拖动选择某一时间段查看在该指定时刻或指定时间段的能耗详情。
①在Energy时间轴中选择一个时间范围,会打开System Event窗口并显示系统事件的详细信息。
②在System Event窗口单击指定系统事件,会打开右侧详情窗口显示详细信息,包括调用的堆栈。
③在右侧详情窗口双击调用堆栈的调用方法条目,会在④源代码编辑器中对应位置突出显示。
能耗分析器会根据影响耗电量的系统事件,包括唤醒锁定、闹钟、位置信息请求、使用传感器等,在Energy时间轴下的System时间轴中显示彩色的条形,表示系统事件处于活动状态的时间范围。唤醒锁定用红色条形表示,闹钟用黄色条形表示,位置信息事件用紫色条形表示。
HiTrace日志跟踪定位分析
说明
DevEco Studio 3.1 Beta1版本暂不支持对HarmonyOS设备中运行的应用进行日志跟踪,我们将在后续版本提供全新的日志跟踪工具,敬请期待。如当前需使用该功能,请下载DevEco Studio 3.0 Release版本进行使用。
在HarmonyOS跨设备分布式应用/服务的问题定位过程中,由于跨设备之间的调用关系复杂,导致问题定位困难。DevEco Studio提供了HiTrace日志跟踪的能力,可以分析和梳理跨设备分布式应用/服务之间的调用关系,通过分析调用链,方便开发者定位调用异常、性能瓶颈等问题。
前提条件
调测的多个设备成功组网,包括连接到同一个WLAN网络和登录同一个华为帐号。
收集Hitrace日志
- 在需要跟踪调用链的RPC调用处,前后分别添加Hitrace类接口,用于采集Hitrace日志。对应的示例代码如下所示:
HiTraceId saveId = HiTrace.getId();
if (saveId.isValid()) {
HiTrace.clearId();
}
HiTraceId id = HiTrace.begin("MyServiceName", HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_TP_INFO);
......
HiTrace.end(id);
if (saveId.isValid()) {
HiTrace.setId(saveId);
}
- 在设备上运行应用/服务,跨设备运行分布式应用/服务的方法请参考运行/调试分布式应用。
- 在底部工具栏单击Profiler,打开Hitrace工具。
- 在Hitrace窗口,单击Record(或
)按钮,开始收集Hitrace日志信息,然后在设备上操作分布式应用/服务。
- 单击
按钮,停止收集Hitrace日志信息。日志采集完成后,可以看到如下的时序视图(上半部分)和调用链详情视图(下半部分)。
Hitrace调用链分析
如上图所示,Hitrace日志采集完成后,会生成时序视图和调用链详情视图,可以利用时序图和调用链详细视图来进行性能分析和故障定位。
- 利用时序图+调用链视图中的Call Tree视图,可以分析分布式跨设备与跨进程的调用关系。
○ 在时序图中,使用不同颜色矩形块区分不同的调用关系,在矩形块中,可以查看调用的开始时间、结束时间和处理时长,帮助开发者分析处理性能。
○ 单击时序图中的矩形块,则会展示进程的调用方向,从而查看其是调用方或被调用方;同时在Call Tree视图中,也可以清晰的展示进程的调用关系(单设备跨进程调用、跨设备进程调用、调用时长等)。
- 利用时序图+调用链视图中的Events视图,可以进行分布式调用的故障定位、诊断和分析。
○ 在时序图中,可以展示相关的异常事件,包括Java Crash异常、JS Crash异常、C/C++ Crash异常、跨设备FA调用异常、ANR故障等。
○ 单击时序图中的异常事件,则会在Events视图中展示具体的异常细节,并会自动抓取异常前30s的详细日志信息。
文章转载自:https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/hitrace-0000001064598156-V3