LeakCanary是一个为OpenHarmony开发的内存泄漏检测库,提供自动化的内存泄漏监控和检测功能。
- 支持自动检测组件内存泄漏
- 基于
WeakMap和FinalizationRegistry实现高效的内存监控 - 基于Navigation的页面,实时监控页面及其子组件的内存状态
- 内存泄漏发送时会在Log中打印一条Tag为GC的error level log
ohpm install @duke/leak-canary
OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包
导入LeakCanary库:
import { LeakCanary } from '@duke/leak-canary';初始化LeakCanary并传入根组件:
LeakCanary.registerRootWatch(rootComponent);手动注册需要监控的组件:
LeakCanary.registerAllChild(component);| 方法名 | 入参 | 接口描述 |
|---|---|---|
| registerRootWatch | rootComponent: object | 注册Navigation根组件进行内存泄漏监控 |
| registerAllChild | component: object | 手动注册需要监控的组件及其所有子组件进行内存泄漏检测 |
LeakCanary通过以下方式实现内存泄漏检测:
- 利用
WeakMap和WeakRef弱引用机制避免干扰正常GC - 通过
FinalizationRegistry监听对象被GC的时机 - 集成OpenHarmony的UI观察者系统,监听导航状态变化
- 在页面即将消失时自动注册该页面的所有子组件进行监控
- 对于@Entry router 下的组件没有很好的自动监控方式,需要手动监控
- 基于目前仅在页面销毁前进行组件注册的方式,对于动态组件可能会监控不到,如if 不满足条件后,但是实际泄漏,则无法被检测到,如有需要,建议手动监控
- 该库不建议在生产环境使用,可能会增加卡顿或者ANR
- 手动注册监听,需要在组件销毁前,不然可能会产生误报
在下述版本验证通过:
DevEco Studio: 6.0.0, SDK: HarmonyOS 6.0.0.120 Release Ohos_sdk_public 6.0.0.47 (API Version 20 Release)
- 手动注册时不在需要考虑时机
- 对于List下复用的组件兼容性测试及支持
- 动态组件监听的实现方案
- 对于Page的自动监听支持
- 添加数据库,存储泄漏信息,提供查询功能
- 添加内存泄漏检测报告页面,分近期和全部
- 添加通知,及时告知泄漏消息
|---- WebSocket
| |---- AppScrope # 示例代码文件夹
| |---- entry # 示例代码文件夹
|---- library
| |---- example # 示例代码文件夹
| |---- src
| |---- main
| |---- ets
| |---- LeakCanary.ts # 主入口文件
| |---- ObjWatch.ts # 内存监控核心实现
| |---- index.ets # 对外接口
| |---- README.md # 安装使用方法
| |---- CHANGELOG.md # 更新日志
使用过程中发现任何问题都可以提 Issue 给我,当然,我也非常欢迎你给我发 PR 。
本项目基于 MIT license ,请自由地享受和参与开源。
- eventpost 事件分发,支持组件中的lifecycle,在组件中使用自动取消订阅: https://gitee.com/Duke_Bit/eventpost
- @duke/view-model 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: https://gitee.com/Duke_Bit/view-model
- @duke/logan-ext Logan扩展库,方便开箱即用: https://gitee.com/Duke_Bit/logan
- @duke/logan Logan是一个为OpenHarmony开发的日志库,对美团技术团队的Logan的鸿蒙化移植版本: https://gitee.com/Duke_Bit/logan
- @duke/websocket-client WebSocket库解决官方API的一些bug问题: https://gitee.com/Duke_Bit/websocket
- @duke/component-lifecycle 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: https://gitee.com/Duke_Bit/component-lifecycle
- @duke/elf-dialog CustomDialog黑魔法 不依赖promptAction 实现的函数级弹窗,省去复杂的模版代码,让你专注于你的业务,一行代码搞定弹窗: https://gitee.com/Duke_Bit/elf-dialog
- @duke/elf-refresh OpenHarmony 刷新组件,支持下拉刷新和上拉加载更多,支持各种组件,List、Grid,支持header,footer,目标打造HarmonyOS的SmartRefreshLayout: https://gitee.com/Duke_Bit/ElfRefresh