ArkTS内存快照聚类分析规则

0 评论 120 浏览 0 收藏 8 分钟

 在通过ArkTS内存快照定位内存泄漏问题时,通常需要优先关注内存占用大的对象,这部分对象在快照中占比比较大。当数量较多时,存在不同调用点创建的对象因为对象类型被归类在同一目录下,如jsobject/jsarray等对象,在大型工程中一般情况下拥有10万以上的数量级,无法通过人工来快速识别同类型不同业务对象各自占用的内存大小。

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

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_envglobal_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代理的对象进行区分。

本文由 @华为开发者联盟 授权发布于人人都是产品经理。未经作者许可,禁止转载

题图来自Unsplash,基于CC0协议

该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 目前还没评论,等你发挥!