鸿蒙中Snapshot分析

什么是Snapshot技术?

Snapshot(快照)是一种记录系统或数据在特定时间点状态的技术。它最初应用于数据库系统,用于实现数据备份和恢复,如今已扩展到各种计算场景中。

Snapshot的核心价值在于能够瞬间完成状态捕获,而不影响系统的正常运行。根据应用场景的不同,Snapshot技术主要分为以下几类:

  • 数据快照:用于数据库和文件系统备份,如HBase Snapshot。

  • 界面快照:用于应用程序界面截图,如HarmonyOS的componentSnapshot。

  • 内存快照:用于捕获应用程序运行时的内存状态。

  • 版本快照:用于开发中的版本控制,如Maven Snapshot。

Harmony中Snapshot模板基本操作

找到profiler中的snapshot

创建Snapshot场景调优分析任务

说明

  • 在任务分析窗口,可以通过"Ctrl+鼠标滚轮"缩放时间轴,通过"Shift+鼠标滚轮"左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
  • 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
  • 鼠标框选要关注的时间段,可以通过"Shift+M"添加时间段时间标签。
  • 在任务分析窗口,可以通过"Ctrl+, "向前选中单点时间标签,通过"Ctrl+. "向后选中单点时间标签。
  • 在任务分析窗口,可以通过"Ctrl+ "向前选中时间段时间标签,通过"Ctrl+"向后选中时间段时间标签。
  1. 设置Snapshot泳道。

    单击任务左上角的

    进行泳道的筛选,再次单击此按钮可关闭设置并生效。

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

开始录制后可观察Memory泳道的内存使用情况,在需要定位的时刻单击任务左上角的

启动一次快照。"ArkTS Snapshot"泳道的紫色区块表示一次快照完成。

在"Statistics"页签中显示当前快照的详细信息:

  • Constructor:构造器。
  • Count:该对象的数量。
  • Distance:从GC Root到这个对象的距离。
  • Shallow Size:该对象的实际大小。
  • Retained Size:当前对象释放时,总共可以释放的内存大小。
  • Native Size:该对象所引用的Native内存大小。
  • Retained Native Size:当前对象释放时,总共可以释放的Native内存大小。
  • 带标识的对象,表示其为全局对象,可以通过全局window对象直接访问

应用对象名称解析

方舟系统目前有方舟应用对象、系统内部框架对象、其他JS对象三类对象,从DevEco Studio 6.0.0 Beta1版本开始,支持对应用对象类的名称进行解析,帮助开发者快速定位问题所在的源码位置,从而提升问题定位效率。

  1. 系统内部框架对象:用于描述HarmonyOS操作系统底层框架的核心对象,提供基础系统能力。为方便开发者查看,当前在Statistics中此类对象均归类到(framework)构造器节点下。此类对象均以_GLOBAL开头。

  2. 方舟应用对象:用于表示HarmonyOS应用中的具体组件、模块或资源。方舟应用对象需按照以下格式命名展示:

    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]

  3. 其他JS对象:用于描述方舟运行时中与JavaScript引擎相关的对象,提供JS语言层面的基础能力。例如:JSArray、JSSharedObject等。

3在 Snapshot分析模板中,支持在Attributes页签点击方舟应用对象名称查看当前所选方舟应用对象的解析结果,便于确认问题出现的位置。各参数含义如下:

  • Module:模块信息。
  • Class:属性名称。
  • Path:编译后的源码路径。支持通过点击属性名称旁边的图标直接跳转至工程中的代码位置,方便开发者快速调试

节点属性与引用链

在"Snapshot"的"Statistics"页签和"Comparison"页签中,所有实例对象节点展开后会显示"<fields>"以及"<references>",这两项节点分别代表该实例对象的属性以及该实例对象的引用链信息。

在"Snapshot"的More区域则展示"Fields"和"References"两个页签,分别代表Detail区域所选择对象的属性以及引用链信息,方便快捷查看所选中对象的属性等详细信息,而不需要跳转至对应对象。

节点跳转

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

历史节点前进/后退

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

比较快照差异

在"Snapshot"的"Comparison"页签中,以当前选择的快照为base,下拉框选择的快照为Target,即可得到两次快照信息的比较结果。

在"Snapshot"的"Comparison"页签中,可进行两次快照的差异比较,比较内容包括新增数、删除数、个数增量、分配大小、释放大小、大小增量等等。通过不断对比,可快速分析和定位内存问题的具体位置。

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

Snapshot分析支持一键向引用链最小的引用距离方向展开。系统会计算从GC Roots垃圾收集器根到选定实例对象的最短路径(最短路径是指Distance逐渐-1的路径,最终抵达Distance = 1的节点),通过最短路径,能够清晰地看到该对象的句柄被哪些对象持有,快速定位问题产生的根源。

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

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

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

引用链可视化

从DevEco Studio 6.0.0 Beta1版本开始,Snapshot模板支持将所有引用链以图表形式展示。系统会计算该节点周边的引用节点,并以关系图的形式清晰展示该对象的引用关系,便于定位问题产生的根源。

选择一个实例结点或reference引用关系节点后,底部搜索栏的Visualization按钮成可点击状态。点击该按钮,配置搜索模式后,系统会计算该节点周边的引用节点,并跳转到Graph页签进行展示。

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

  • Retained Size:按照Retained Size从大到小展示周边节点。
  • Distance:按照Distance从小到大展示周边节点。

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

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

当在节点点击右键,展示的菜单列表包括以下选项:

  • Show More References:展示当前节点更多的引用链。配置搜索模式后,重新生成以该节点为中心的引用链图形。
  • Show Path to GC Root:展示当前节点到GC Root的路径。选择搜索模式后,重新生成以该节点为中心到GC Root的引用链图形。
  • Redraw with this node:以该节点为中心重绘。
  • Reveal in Statistics:在Statistics页面中显示该节点。
  • Clear Diagram:清空当前图表中的所有内容。且清空底部栏的激活状态。

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

Heap Snapshot离线导入

evEco Profiler提供Heap Snapshot离线导入能力,可导入一个或多个.heapsnapshot文件。

您可以在DevEco Profiler主界面的"Create Session"区域中,单击"Open File",导入.heapsnapshot文件。

说明

  • 导入的单个文件大小不超过1.5G。
  • 批量导入的文件数量不超过10个。

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

说明

  • 导入的单个jsleaklist文件大小不超过30M。
  • 导入的jsleaklist文件通过文件中的hash值与已导入的heapsnapshot文件匹配。
  • 可多次导入不同的jsleaklist文件,也可同时导入多个不同的jsleaklist文件,重复导入不会覆盖已导入的匹配上的jsleaklist文件。总的导入匹配成功的文件数量不超过导入的heapsnapshot文件。

Raw Heap离线导入

DevEco Profiler提供Raw Heap离线导入能力,可导入一个或多个.rawheap文件。

单击"Open File",导入.rawheap文件后以下图所示形式呈现。

说明

  • .rawheap文件是应用发生Out of Memory现象时产生的原始内存文件。
  • 导入的单个文件解析后大小不超过1.5G。
  • 批量导入的文件数量不超过10个。

总结

Snapshot技术作为数字世界中的"瞬间冻结"能力,已经成为了现代软件开发中不可或缺的一部分。从Web开发到鸿蒙应用,从数据备份到界面捕获,Snapshot技术都发挥着重要作用。

在鸿蒙生态中,componentSnapshot API也为开发者提供了强大的界面截图能力,但也需要了解其限制和最佳实践。随着技术的不断发展,Snapshot技术将继续演进,为开发者提供更加强大和便捷的工具。

无论是开发快速启动的相机应用,还是实现复杂的界面截图功能,或者是确保数据安全备份,Snapshot技术都值得开发者深入学习和掌握

华为开发者学堂

相关推荐
360智汇云6 小时前
鸿蒙开发中如何实现画中画
华为·harmonyos
donk13148 小时前
React Native for OpenHarmony 实战:三方库 react-native-toast-message 的鸿蒙化适配指南
react native·react.js·音视频·harmonyos
Flutter_OH8 小时前
Flutter OHOS Dart 堆栈符号化
harmonyos
Flutter_OH8 小时前
Flutter OHOS Flutter 多设备自适应 DPI 指导文档
harmonyos
SuperHeroWu79 小时前
【HarmonyOS 7】 应用 Agent 接入云 A2A 与端 A2A 的实践详解
ai·harmonyos·小艺
用户29469405448169 小时前
个人开发者上架鸿蒙 AI 应用,最后倒在安全评估实名制这一格
harmonyos·deepseek
Keya10 小时前
HarmonyOS 开发实战:用 util.Aspect 玩转 AOP 切面编程
harmonyos
威哥爱编程11 小时前
HarmonyOS 7 Agent 开发实战 03:Tool Calling 让 AI 查实时订单与库存
agent·harmonyos
威哥爱编程11 小时前
HarmonyOS 7 Agent 开发实战 02:Agent 工程脚手架与对话 UI 骨架
agent·harmonyos
Georgewu19 小时前
【HarmonyOS 7】 HarmonyOS 应用 Skill创建和编排详解
harmonyos