一针见血!用JSLeakWatcher解决HarmonyOS内存泄漏难题

0 评论 139 浏览 0 收藏 7 分钟

 想象一下:用户打开你的应用,刚开始流畅如飞,用了10分钟后开始卡顿,20分钟后直接闪退——这就是内存泄漏的"杰作"!就像房间里的垃圾越堆越多,最终无处下脚。

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

一针见血!用JSLeakWatcher解决HarmonyOS内存泄漏难题-华为开发者话题 | 华为开发者联盟

 

一、为什么你的HarmonyOS应用越来越卡?

想象一下:用户打开你的应用,刚开始流畅如飞,用了10分钟后开始卡顿,20分钟后直接闪退——这就是内存泄漏的”杰作”!就像房间里的垃圾越堆越多,最终无处下脚。

三大“罪状”:

1. 让手机变卡:系统要不停打扫垃圾(GC),每次打扫时可能会导致应用卡顿;

2. 让应用闪退:内存爆满时直接崩溃,用户骂骂咧咧离开;

3. 让手机发烫:频繁打扫垃圾让CPU疯狂工作,手机烫得能煎鸡蛋。

二、JSLeakWatcher:你的专属“内存侦探”

它能帮你抓住谁?

1、五大组件对象:自定义组件、Ability组件对象、XComponent组件对象、NodeContainer组件对象、Window组件对象;

2、用户自定义对象。

破案三件套:

       1、 监控名单:记录哪些对象被销毁了;

       2、 回收记录:记录哪些对象真的被清理(GC)了;

       3、 对比找茬:销毁了但是却没有被清理掉的,就是“泄漏犯”!

三、三步抓住内存“罪犯”

第一步:安装“监控摄像头”

import { jsLeakWatcher } from '@kit.PerformanceAnalysisKit';

// 对JSLeakWatcher进行配置
let config: jsLeakWatcher.LeakWatcherConfig = {
  monitorObjectTypes: jsLeakWatcher.MonitorObjectType.CUSTOM_COMPONENT,
  objectUniqueIDs: [10001, 10002],
  checkInterval: 120000,
  fgLeakCountThreshold: 5,
  bgLeakCountThreshold: 3,
  maxStoredHeapDumps: 15,
  dumpHeapWaitTimeMs: 10000,
  exclusionList: ['CustomComponent1', 'CustomComponent2']
};

// 调用接口使能JsLeakWatcher
jsLeakWatcher.enableLeakWatcher(true, config, (filepath : Array<string>) => {
  hilog.info(0x0000, 'testTag', `testJsLeakWatcher leakListFileName: ${filepath[0]}`);
  hilog.info(0x0000, 'testTag', `testJsLeakWatcher heapDumpFileName: ${filepath[1]}`);
});

第二步:自动收集证据

JSLeakWatcher会周期性进行泄漏检测,如果检测到泄漏对象,会生成两个文件:

(1)*.rawheap:内存现场照片;

(2)*.jsleaklist:就像是“嫌疑犯名单”。

第三步:用DevEco Studio破案

把第二步生成的两个文件导入到DevEco Studio(DevEco Studio 6.0.0起均支持),就可以直接查看到“泄漏犯”!

查看“泄漏犯”的相关信息(例如引用链、属性信息),加速找到导致泄露的代码。

四、案例实践

某大厂在测试环境中察觉有ArkTS内存泄漏问题,于是借助JSLeakWatcher进行定位。

第一步:使能JSLeakWatcher

第二步:获取泄漏对象信息

第三步:定位代码行

第四步:Profiler现场抓取二次确认

第五步:问题解决

       1、 定位出泄漏原因:harmonyShare多次注册但只解注册一次;

       2、 解决方法:删除harmonyShare多余注册逻辑,保证只注册一次即可。

       JSLeakWatcher已经成为该大厂定位ArkTS内存泄漏问题的主要手段,帮助定位20+ArkTS内存泄漏问题,ArkTS OOM率降低92.3%。

五、重要提醒!

1、不要在生产环境使用:JSLeakWatcher执行泄漏检测存在性能开销(主要是GC和dump操作导致的),会导致应用卡顿;

2、别太频繁检查:JSLeakWatcher的泄漏检测间隔时间设置大一些.,缓解应用卡顿问题;

3、及时清理文件:生成的泄漏文件最多保存10份,超过10份,最老的文件会被老化掉。

4、更多的知识库:如果你想了解更多,JSLeakWatcher的开发实践见官方文档https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-js-leak-watcher ,接口说明见官方文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-jsleakwatcher 

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

题图来自Unsplash,基于CC0协议

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

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