js 内存泄漏排查
在需要排查的场景先后进行两次 dump, 比如排查页面泄漏,在进入页面前 dump 一次,进入页面退出后再 dump 一次
导出泄漏可以分为两种情况
-
如果应用不需要底层能力支撑
比如不需要
blueos.multimedia.audio这些底层能力,可以直接在 BlueOS Studio 测试,打开Devtool → Snapshot → Profile,在目标场景前后分别点击 dump 导出 heap -
如果应用需要底层能力支持
先安装具有能 dump js heap 的固件, dump_js_heap /sdcard , 然后拷贝到主机,在 BlueOS Studio 的 Devtool → Snapshot → Profile 面板加载该 heap 文件
js heap 的分析与导出入口位于 BlueOS Studio:Devtool → Snapshot → Profile。
比如我们构造一个常见的泄漏,event 订阅了但没有取消 (npm 类库 [eventEmitter3]有类似的问题)
import event from '@blueos.app.event' onReady() { const that = this const evtId = event.subscribe({ eventName: 'myEventName', callback: function MyEvent(res) { console.log(res.params) that.hello() }, })进入退出页面后,导出两份 snapshot,选中较新的一份,将视图切换到 comparison,然后重点关注 Delta 列, 增量即为泄漏
可以重点关注以下对象
- App, 每个应用有一个,如果新增,代表应用泄漏
- Page,对应一个页面或者表盘,有新增代表相关泄漏
- Vm,每个 Page 和自定义组件对应一个 Vm,List 的每个 Item 不触发 JIT 的情况也会有
- 自己 Page 中特有的对象和函数
-
在 comparison 结果中查看 Page 对象的
_valid字段,可判断 Page 是否泄漏 -
若某对象内容不为空(有右箭头),说明有 timer 泄漏
这个格式其实是 chrome 的 devtools 的标准格式