在应用性能优化中,内存泄漏是常见问题。DevEco Profiler的Snapshot模板提供了方舟虚拟机内存快照分析能力,结合Memory实时占用情况,分析不同时刻的内存对象占用情况及差异。

一、功能介绍

1.1 支持的泳道

泳道 说明
Memory 内存实时占用情况
ArkTS Snapshot 内存快照分析(本文重点)

注意:由于隐私安全政策,已上架应用市场的应用不支持使用Snapshot分析模板

快照抓取设置

单击ArkTS Snapshot泳道的options下拉列表,可以设置是否需要抓取基础类型number的数据(默认不抓取)。

二、查看快照详情

2.1 抓取快照

观察Memory泳道的内存使用情况,在需要定位的时刻单击任务左上角的快照图标启动一次快照,完成后在ArkTS Snapshot泳道出现紫色区块

2.2 Statistics区域字段

字段 说明
Constructor 构造器
Count 该对象的数量
Distance 从GC Root到这个对象的距离
Shallow Size 该对象的实际大小
Retained Size 当前对象释放时,总共可以释放的内存大小
Native Size 该对象所引用的Native内存大小
Retained Native Size 当前对象释放时,总共可以释放的Native内存大小

说明:带![全局对象标识]标识的对象表示其为全局对象,可以通过全局window对象直接访问。

2.3 内存回收

单击分析窗口左上角的回收图标可启动内存回收机制,将不再被访问的内存空间归还给系统。

三、比较快照差异

在ArkTS Snapshot泳道的Comparison区域

  1. 点击任一快照作为base

  2. CompareTo下拉框选择Target快照

  3. 得到两次快照信息的比较结果

比较内容包括:新增数、删除数、个数增量、分配大小、释放大小、大小增量等。

通过不断对比,可快速分析和定位内存问题的具体位置。

四、应用对象名称说明

4.1 三类对象

类型 说明 命名格式
系统内部框架对象 HarmonyOS底层框架核心对象,归类到(framework)构造器节点下 以_GLOBAL开头
方舟应用对象 应用中的具体组件、模块或资源 BundleName/SelfModule@Version/FilePath/File#Class(line: xx)[RefModule]
其他JS对象 方舟运行时中与JavaScript引擎相关的对象 如JSArray、JSSharedObject等

4.2 对象解析

在Attributes页签点击方舟应用对象名称查看解析结果:

参数 说明
Module 模块信息
Class 属性名称
Path 编译后的源码路径(支持点击图标跳转至工程代码)

说明

  • 确保工程代码路径与解析信息匹配,否则跳转可能失败

  • 系统内部框架对象(framework)仅提供基本信息,不支持跳转

  • 对象名称后的line=0时表示无效行号,不支持跳转

五、引用链分析

5.1 查看节点属性和引用链

展开实例对象节点,可看到fields(属性)和references(引用链信息)。也可在右侧More区域查看Fields和References。

5.2 节点跳转

在Comparison区域,单击对象所在行行尾的跳转图标,跳转至该对象所在的Statistics区域并定位至该对象所在位置。

5.3 历史节点前进和后退

单击详情区域左下角的左右箭头,可以前进或后退至下一个或上一个历史节点(最多三个)。

5.4 引用链向最小引用距离展开

DevEco Studio 6.1.0 Beta2及之后

选择一个实例节点,系统自动计算从GC Roots到选定对象的最短路径,并在右侧Shortest Paths页签实时切换和展示。

DevEco Studio 6.1.0 Beta2之前

选择一个实例节点,点击底部搜索栏的Path to GC Root按钮,选择搜索模式:

模式 说明
单根路径搜索(默认) 展示一条最短路径
指定数量的根路径搜索 展示指定数量的最短路径
展示所有根路径 展示所有最短路径

5.5 合并展示最小引用距离(6.1.1 Beta1+)

在Statistics区域,选中一个构造器或实例节点,点击底部搜索栏的References按钮,在右侧Merged Incoming References页签查看该节点构造器下的所有实例到GC Roots的最短路径。

5.6 引用链可视化(6.0.0 Beta1+)

选择一个实例节点或reference引用关系节点,点击底部搜索栏的Visualization按钮,配置搜索模式:

模式 说明
Retained Size 按Retained Size从大到小展示周边节点
Distance 按Distance从小到大展示周边节点

系统计算该节点周边的引用节点,在Graph页签以关系图形式展示(最多30个节点,默认20个)。

图形操作

操作 说明
节点右键菜单 Show More References、Show Path to GC Root、Redraw with this node、Reveal in Statistics、Clear Diagram
缩放 Ctrl+鼠标滚轮
悬停 显示详细信息
历史跳转 左右箭头跳转历史图形(最多三个)

六、离线导入内存快照文件

6.1 导入heapsnapshot/rawheap

在Create Session区域,单击Open File,导入.heapsnapshot或.rawheap文件。

限制 说明
单个文件大小 ≤ 1.5G
批量文件数量 ≤ 10个

说明:.rawheap文件是应用发生OOM时产生的原始内存文件。

6.2 导入jsleaklist文件

导入与.heapsnapshot或.rawheap文件匹配的.jsleaklist文件,展示jsleakwatcher监控采集到的内存泄漏对象。

限制 说明
单个文件大小 ≤ 30M
匹配方式 通过文件中的hash值匹配
数量限制 总的导入匹配成功的文件数量不超过导入的heapsnapshot文件

七、解析内存对象(6.1.0 Beta2+)

导入代码混淆产物nameCache文件和sourceMap文件,还原文件名称和文件路径。

示例:导入前Class显示为d8,导入nameCache后显示为MyAbilityStage

   鸿蒙Snapshot模板通过ArkTS Snapshot泳道抓取内存快照(紫色区块),支持快照对比(Comparison)识别内存增量,对象名称解析(Attributes)定位源码,引用链分析包括最短路径(Path to GC Root)、合并展示(Merged Incoming References,6.1.1+)、可视化(Graph,6.0.0+),支持离线导入heapsnapshot/rawheap/jsleaklist和nameCache/sourceMap解析,帮助定位内存泄漏问题。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐