写点什么

ArkTS 内存快照聚类分析规则

  • 2026-06-29
    北京
  • 本文字数:1214 字

    阅读完需:约 4 分钟

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

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

聚类需求背景

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

聚类步骤描述

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

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

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

聚类规则

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

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

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

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

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

特殊聚类

无需聚类对象类型

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

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

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

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

异步任务相关对象

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

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

proxy

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