鸿蒙性能优化:内存泄漏分析
在应用性能优化中,内存泄漏是常见问题。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区域:
-
点击任一快照作为base
-
在CompareTo下拉框选择Target快照
-
得到两次快照信息的比较结果
比较内容包括:新增数、删除数、个数增量、分配大小、释放大小、大小增量等。
通过不断对比,可快速分析和定位内存问题的具体位置。
四、应用对象名称说明
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解析,帮助定位内存泄漏问题。
更多推荐




所有评论(0)