针对方舟虚拟机,DevEco Profiler提供了内存快照分析能力,结合Memory实时占用情况,分析不同时刻的方舟虚拟机内存对象占用情况及差异。
Snapshot模板支持的泳道包括:Memory、ArkTS Snapshot。本文介绍ArkTS Snapshot泳道,Memory泳道的详细信息请参考Allocation分析。

启动一次快照,一次快照完成后会在ArkTS Snapshot泳道出现紫色区块。
点选ArkTS Snapshot泳道的紫色区块,Statistics区域显示当前快照的详细信息:
标识的对象,表示其为全局对象,可以通过全局window对象直接访问。
可启动内存回收机制。在ArkTS Snapshot泳道的Comparison区域,点击任一快照作为base,在CompareTo下拉框选择的快照作为Target,即可得到两次快照信息的比较结果。比较内容包括新增数、删除数、个数增量、分配大小、释放大小、大小增量等等。通过不断对比,可快速分析和定位内存问题的具体位置。

方舟系统目前有方舟应用对象、系统内部框架对象、其他JS对象三类对象,从DevEco Studio 6.0.0 Beta1版本开始, ArkTS Snapshot泳道支持对应用对象类的名称进行解析,帮助开发者快速定位问题所在的源码位置,从而提升问题定位效率。
com.example.app/MainModule@1.0.0/src/main/ets/MainPage.ets#MainPage(line: 10)[MainModule] //格式为BundleName/SelfModule@Version/FilePath/File#Class(line: xx)[RefModule]
在 Snapshot分析模板中,支持在Attributes页签点击方舟应用对象名称查看当前所选方舟应用对象的解析结果,便于确认问题出现的位置。各参数含义如下:
图标直接跳转至工程中的代码位置,方便开发者快速调试。
若应用编译模式是release,且启用了源码混淆,方舟应用对象将展示混淆后的数据。支持在Attributes页签查看当前所选应用对象的源码信息。

在ArkTS Snapshot泳道的Statistics区域和Comparison区域中,展开所有实例对象节点,可看到fields和references,分别表示该实例对象的属性和该实例对象的引用链信息,或者点击实例对象,在右侧More区域中查找Fields和References。

在“ArkTS Snapshot泳道的Comparison区域中,查看内存对象、对象属性及其引用链时,若要查看某一对象的详细信息,可以单击该对象所在行行尾的跳转图标跳转至该对象所在的Statistics区域并定位至该对象所在的位置,以查看该对象的详细信息。

当在ArkTS Snapshot泳道的Comparison和Statistics之间进行节点跳转后,单击详情区域左下角的左右箭头可以前进或者后退至下一个或上一个历史节点,以便快速在多个历史节点之间跳转查看。当箭头为激活状态时,表示前进/后退功能可用,当箭头为灰色状态时则代表无法使用该功能。

从26.0.0版本开始,ArkTS Snapshot泳道支持一键获取节点支配树,系统会以GC Roots为根节点构建内存对象的支配树。选中一个实例结点后,在右侧Dominator Paths页签查看支配树。
在支配树结构中,若到达目标对象的任何路径都必须经过某节点,则该节点即为其支配者。通过展示从GC Roots到目标实例在支配树上的支配链,系统能够剥离错综复杂的冗余与交叉引用,直接定位到内存泄漏的支配者。断开路径上的支配者即可释放关联内存,从而更精准、高效地解决内存泄漏问题。

ArkTS Snapshot泳道支持一键向引用链最小的引用距离方向展开。系统会计算从GC Roots垃圾收集器根到选定实例对象的最短路径(最短路径是指Distance逐渐-1的路径,最终抵达Distance = 1的节点),通过最短路径,能够清晰地看到该对象的句柄被哪些对象持有,快速定位问题产生的根源。
选择一个实例节点,系统会计算从GC Roots到选定对象的最短路径,并在右侧Shortest Paths页签展示。
从26.0.0版本开始,点击Shortest Paths页签左侧的
按钮,可将页签中的数据导出到本地进行保存。

从26.0.0版本开始,若应用编译模式为release,且启用了源码混淆,Constructor将展示混淆后的源码路径。若调试应用工程存在对应的nameCache文件,点击Show SourceClassName按钮,即可显示混淆前的源码路径,否则需要导入调试应用对应的nameCache文件后再点击按钮。
此外,若调试应用工程存在对应的SourceMap文件,点击源码路径旁边的
图标,可直接跳转至工程中的代码位置,方便开发者快速调试,否则需要导入调试应用对应的SourceMap文件后再点击按钮跳转到源码。

选择一个实例节点,底部搜索栏的Path to GC Root按钮呈可点击状态。点击该按钮选择搜索模式并确认,系统会计算从GC Roots到选定对象的最短路径,并在右侧Shortest Paths页签展示。

目前支持单根路径搜索、指定数量的根路径搜索和展示所有根路径三种搜索模式,默认为单根搜索。

设置完搜索模式后点击OK,右侧more区域会自动跳转至Shortest Paths页面展示搜索结果。

从DevEco Studio 6.1.1 Beta1版本开始,在ArkTS Snapshot泳道的Statistics区域中,选中一个构造器或实例结点,点击底部搜索栏的References按钮并确认,在右侧Merged Incoming References页签可查看该节点构造器下的所有实例到GC Roots的最短路径。

从26.0.0版本起,ArkTS Snapshot泳道的Statistics区域支持按不同聚类规则展示构造器或对象。
当前支持的构造器类型包括:JSObject、JSSharedObject、JSArray、Proxy和 (string),对象类型包括:LocalHandleRoot、GlobalHandleRoot。
当前支持的聚类规则包括:Merge Shortest Paths、Merge Same Property、Merge Same Property and Shortest Paths、ClassName、NativeList、Merge ClassName and NativeList。
构造器或对象适用的聚类规则如下:
构造器或对象 | 支持的聚类规则 |
|---|---|
JSObject | Merge Shortest Paths、Merge Same Property、Merge Same Property and Shortest Paths |
JSSharedObject | Merge Shortest Paths、Merge Same Property、Merge Same Property and Shortest Paths |
JSArray | Merge Shortest Paths、Merge Same Property、Merge Same Property and Shortest Paths |
Proxy | Merge Shortest Paths、Merge Same Property、Merge Same Property and Shortest Paths |
(string) | Merge Shortest Paths |
LocalHandleRoot | ClassName、NativeList、Merge ClassName and NativeList |
GlobalHandleRoot | ClassName、NativeList、Merge ClassName and NativeList |
对于LocalHandleRoot和GlobalHandleRoot对象,不同模板支持的聚类规则有所差异,具体为:
选择构造器或对象后,底部搜索栏按钮呈可点击状态。点击该按钮并配置聚类规则,展开构造器时将按规则展示。

从DevEco Studio 6.0.0 Beta1版本开始,ArkTS Snapshot泳道支持将所有引用链以图表形式展示。系统会计算该节点周边的引用节点,并以关系图的形式清晰展示该对象的引用关系,便于定位问题产生的根源。
选择一个实例结点或reference引用关系节点后,底部搜索栏的Visualization按钮呈可点击状态。点击该按钮,配置搜索模式后,系统会计算该节点周边的引用节点,并跳转到Graph页签进行展示。

目前支持最多展示30个周边节点,默认展示20个。当前支持以下两种优先级的引用链展开方式:

设置完搜索模式后点击OK,底部页签会自动跳转至Graph页面展示搜索结果,红色标示的是中心节点,线段展示连接的两个节点之间的引用关系。

支持选中节点,右侧的More区域将展示该节点的详细信息,包括Fields、References和Shortest Paths三个页签。当鼠标悬浮在图形上的节点或线段时,悬浮框将展示对应的详细信息。图形区域支持拖动查看,使用Ctrl+鼠标滚轮可对图形进行缩放。
当在节点点击右键,展示的菜单列表包括以下选项:

点击Show More References、Show Path to GC Root和Redraw with this node选项后,单击详情区域左下角的左右箭头,可以前进或者后退至下一个或上一个历史图形,以便在多个(最多三个)可视化图形之间跳转查看。当箭头为激活状态时,表示可用,当箭头为灰色状态时则代表无法使用该功能。

ArkTS Snapshot泳道的Statistics区域和Comparison区域支持按对象名称搜索内存对象,在底部搜索框中输入对象名称即可进行模糊查询。
从26.0.0版本开始,Statistics区域底部搜索框支持通过对象id精确定位目标对象,格式为:@id。

26.0.0及以上版本,支持单独导入一个或多个.rawheap文件,同时工具会自动导入匹配的.jsleaklist文件,若匹配的.jsleaklist文件不存在,则导入失败;支持导入一个或多个.jsleaklist文件后,工具自动导入匹配的.rawheap文件;也支持先导入一个或多个.heapsnapshot或.rawheap文件,再手动导入匹配的.jsleaklist文件。
26.0.0以下版本,支持先导入一个或多个.heapsnapshot或.rawheap文件,再手动导入匹配的.jsleaklist文件。

从DevEco Studio 6.1.0 Beta2开始,DevEco Profiler支持导入代码混淆产物nameCache文件和ArkTS调试产物sourceMap文件,还原文件名称和文件路径。以nameCache文件为例。
文件导入前,Class为d8。

点击工具栏
按钮,导入nameCache文件,Class显示为文件名称MyAbilityStage。
