ArkTS内存快照聚类分析规则
头像 鸿蒙小助手 2026-06-29 10:30:20    发布
2259 浏览 11 点赞 2 收藏

本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:

ArkTS内存快照聚类分析规则-华为开发者话题 | 华为开发者联盟

一、聚类需求背景

      在通过ArkTS内存快照定位内存泄漏问题时,通常需要优先关注内存占用大的对象,这部分对象在快照中占比比较大。当数量较多时,存在不同调用点创建的对象因为对象类型被归类在同一目录下,如jsobject/jsarray等对象,在大型工程中一般情况下拥有10万以上的数量级,无法通过人工来快速识别同类型不同业务对象各自占用的内存大小。因此,需要聚类规则来指导针对快照的聚类分析,将快照中的同类对象进行聚类,从而统计出各泄漏对象的影响大小,对定位内存泄漏问题有着关键性的指导作用。

二、聚类步骤描述

      1. 确认聚类锚点,只聚类top20的目录下的对象 && retained size占在5%以上的目录下的对象;

      2. 通过聚类规则对各类对象进行聚类。为了保证聚类结果的有效性,不同的目录下存放的对象不同,聚类规则也不同。

      3. 统计各类对象的数量及内存占用大小,能够按照对象的数量或内存大小进行排序

三、聚类规则

      聚类规则主要分为三种:最短引用链聚类,名称聚类,属性聚类。不同的对象需要使用不同的聚类方法。

      注:建议所有对象默认按照最短引用链聚类。

1. 最短引用链聚类(基本类型对象默认按照最短引用链聚类)

      默认适用对象类型:Method,js_set,js_map,string,JSNativePointer,jsarray等

      Method,js_set,Map,string,JSNativePointer等目录下对象,优先通过引用链聚类。该类对象目录下名称一致,通过引用链可以区分对象创建场景。对比目录下各对象到GC ROOT的最短引用链(如果有多条最短引用链则选择retained size最大的那条引用链),最短引用链相同,则视为一类。

2. 名字 + 引用链聚类

      适用对象类型:Function ,framework,(array),各类业务对象(业务侧创建的类对象和函数对象)

      业务对象带有路径对象名称和行号信息。相同的类或函数对象调用点不同,则引用链不同,需要根据不同的调用点进行区分。

3. 属性+引用链聚类

      适用对象类型:jsobject,js_shared_object

      jsobject(js_shared_object)目录下对象名字相同,但代表的对象并不一致,需要通过引用链对jsobject对象进行分类,即对不同调用点的jsobject进行区分。

      jsobject对象中存在大量distance为1的对象,这些对象无法通过引用链区分,但可以通过属性进行区分,即直接持有的对象是否一致,如果jsobject对象直接持有的对象名称都相同,且持有关系(紫色的字代表持有关系)也相同,则归为一类。

4.特殊聚类

4.1 无需聚类对象类型

      适用对象:SourceTextModule, HiddenClass(NonMovable), global_env, global_object

      SourceTextModule对象是系统侧创建的,用于持有export对象。每个ts文件会对应生成一个SourceTextModule对象,持有该ts文件中export的对象,因此天然就已经是聚类后的结果,不需要再次聚类。

HiddenClass和其他对象是1对多的关系,每一个对象都持有一个HiddenClass对象的引用,因此每一个HiddenClass都是一类。

      GlobalEnv和GlobalObject在一份快照中是唯一的,因此也无需聚类。

4.2 异步任务相关对象

      适用对象:Promise/PromiseRecord/PromiseCapability/PromiseReaction

      异步相关的对象,请根据PromiseReaction下的handle信息+最短引用链进行聚类。Promise/PromiseRecord/PromiseCapability 对象为异步任务内部对象,开发者无需关注。PromiseReaction下的handle信息代表了该异步任务的下一跳任务,可以通过下一跳任务进行区分。

4.3 proxy

      proxy往往与框架对象强相关,可以通过proxy下的target信息(handle)+引用链进行聚类。proxy下的target信息代表了proxy持有的被代理对象,proxy本身无意义,需要根据被proxy代理的对象进行区分。


©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
HarmonyOS
头像

鸿蒙小助手

致力于为鸿蒙开发者谋福利

1099

帖子

8

提问

13572

粉丝

关注
热门推荐
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除

京ICP备:2022009079号-2

京公网安备:11010502051901号

ICP证:京B2-20230255