JSLeakWatcher特性指导

📅 2026/6/30 13:03:54
JSLeakWatcher特性指导
本原创文章帖发布在华为开发者联盟社区欢迎开发者前往访问评论交流更多与该内容相关讨论请点击原帖查看JSLeakWatcher特性指导-华为开发者话题 | 华为开发者联盟1、概述1.1 背景在ArkTS开发中若一个ArkTS对象不再需要但仍被某个引用链“意外”持有则垃圾回收器无法回收该内存从而导致内存泄漏。ArkTS对象内存泄漏通常会带来以下影响1、性能若应用占用内存持续增长系统为释放内存会频繁触发GC而GC执行时会暂停应用主线程Stop-The-World机制导致界面卡顿、滑动不流畅长期泄漏同时也会让内存碎片化严重系统分配/释放内存效率降低进一步拖慢应用运行速度发生响应变慢等问题2、内存若应用泄漏内存持续积累并达到ArkTS Local堆/共享堆或进程的OOM的上限阈值时则会产生JS Crash3、功耗系统频繁GC会消耗大量CPU资源持续高占用会导致设备发热加速电量消耗4、功能部分泄漏会因对象引用残留间接导致功能异常如ArkUI组件状态错乱、资源冲突、回调重复执行等。1.2 JSLeakWatcher介绍为帮助开发人员快速定位ArkTS对象内存泄漏问题HarmonyOS提供了ArkTS内存泄漏检测能力JSLeakWatcher开发者可轻松接入相关API实现对系统内具有生命周期的ArkTS组件对象定期执行泄漏自检测。当检测到ArkTS对象有内存泄漏时JSLeakWatcher会生成泄漏信息文件包括*.rawheap文件和*.jsleaklist文件详细参考2.4将这两个文件导入IDEDevEco Studio 6.0.0起均支持就可以获取泄露对象列表。通过泄漏对象列表中的泄漏对象直接跳转到引用链加速找到持有该泄漏对象的根GC_ROOT提升泄漏问题闭环效率降低定界定位成本。对于自定义组件和Ability组件对象JSLeakWatcher可以直接关联到业务代码信息XComponent组件、NodeContainer组件、Window组件不支持关联到业务代码信息。2、实现原理2.1 原理描述JSLeakWatcher提供了清晰、易用的ArkTS接口主要功能如下1、定期对目标应用执行一次垃圾回收操作FullGC尝试回收当前所有根不可达的ArkTS对象未被GC_ROOT对象持有的ArkTS对象2、当执行完垃圾回收操作后若框架检测到仍有未被回收的ArkTS对象则立即生成此刻的ArkTS堆快照*.rawheap文件及泄漏对象列表*.jsleaklist文件并存放在应用沙箱内。ArkTS对象发生内存泄漏通常是因为对象在生命周期结束后仍未被解除引用导致垃圾回收器GC无法识别并将其回收。常见原因包括1Native层强引用该对象在Node-API中对ArkTS对象创建了持久化强引用。Node-API介绍参考Node-API简介创建和销毁强引用方式参考napi_create_reference、napi_delete_reference2闭包捕获内部函数持有对外部作用域ArkTS对象的引用即使外部作用域已退出3全局或模块级缓存使用Map、Array缓存长期持有ArkTS对象。2.2 泄漏检测流程1、应用在启动后调用enableLeakWatcher()接口开启ArkTS泄漏检测功能。2、检测流程1通过FinalizationRegistry机制注册监控组件对象的GC回调函数同时注册销毁回调函数。说明FinalizationRegistry是JavaScript提供的弱引用监听机制当注册的对象被垃圾回收时会自动触发预设的回调函数2当组件对象被销毁时销毁的回调函数会将对象记录在list1中这些被销毁同时记录在list1中的对象应该在GC后被清除掉3被销毁的组件在被GC时周期性执行默认90秒GC的回调函数会将该对象记录在list2中记录在list2中的对象被成功GC掉4list1-list2就是泄漏对象5list1-list2如果不为空则说明存在泄漏GC后延迟一段时间默认5秒异步dump ArkTS堆快照生成*.rawheap文件然后根据list1-list2对象数组生成*.jsleaklist文件最后将*.rawheap文件和*.jsleaklist文件落盘在应用沙箱中6通过将*.rawheap文件和*.jsleaklist文件导出到IDE中即可以获取泄漏对象的详细信息。3、应用在退出时调用enableLeakWatcher接口关闭ArkTS泄漏检测功能。2.3 关键能力截止7.0版本API 26.0.0JSLeakWatcher支持以下关键能力含配置1、组件相关1支持监控五大类型组件包括NodeContainer、Ability、Window、XComponent、CustomComponent。2支持指定要检测的对象变量名只监控相关对象是否存在泄漏3支持指定要检测的组件类型名只监控相关类型下面所有的对象是否存在泄漏4支持指定要检测的自定义组件id名单只监控相关id的对象是否存在泄漏5支持指定不检测的自定义组件类名、Abilty类名和Window窗口名名单传入自定义组件类名、Abilty类名和Window窗口名名单不监控相关对象是否存在泄漏2、调用机制1插桩调用支持在业务代码中调用接口使用2测试环境新增支持应用免插桩调用通过将系统参数“hiviewdfx.hichecker.jsleakwatcher.leak.check”设置为“enable.应用名”相关配置使用默认值发生泄漏后上报系统事件最后在Deveco Testing从7.0.0.200版本开始支持呈现泄漏内容。3、dump机制1支持异步dump快照2支持自定义配置dump触发条件应用在前台/后台泄漏个数为多少时执行dump3支持配置最大dump个数默认10份快照文件超过后会老化3支持配置GC后多久执行快照dump默认是5秒4、快照生成和老化机制1只要有泄漏被检测到就会新dump一份快照并生成一个泄漏列表文件新文件生成之前同一生命周期内生成的老的快照文件和泄漏列表文件都会被删除。文件生成完之后会通过回调告知应用快照文件路径和泄露列表文件路径2应用沙箱内文件上限默认是20个超过20个文件会被老化。5、检测间隔1支持配置每轮检测间隔时间默认且最小为90秒。如果用户设置的时间小于90秒将不会生效。注意GC属于高开销操作会导致应用卡顿因此建议开发者根据实际情况调大检测间隔减轻卡顿频率。2.4 生成文件介绍1、*.rawheap文件记录了抓快照时所有无法被回收的ArkTS对象信息包括泄漏对象和GC_ROOT可达对象。快照内容包括ArkTS对象的节点属性与引用链包括对象类型、涉及的代码行等。2、*.jsleaklist文件统计无法回收的ArkTS泄漏对象列表导入到IDE可以和rawheap中的ArkTS对象通过ID进行匹配查看ArkTS对象中的各属性。3、开发实践见官方文档https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-js-leak-watcher 。4、接口说明见官方文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-jsleakwatcher