一针见血!用JSLeakWatcher解决HarmonyOS内存泄漏难题
本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:
一针见血!用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 。
----------------------------------------------------------------------------------------------------------
🔗官网开发者学堂视频:华为开发者学堂
🔗社区DFX专题文章:华为开发者问答 | 华为开发者联盟
【扫码加入 HarmonyOS DFX 技术交流群】