基础库: 3.7.7
我参照
代码片段, 在开发者工具运行是可以可以复现,即页面没有被销毁,真机调试重复进入页面内存会递增, 使用 GC 后也没有减少,因为代码比较简单,不存在跨引用的场景, 我使用 webview 加载内存是正常回收的,我不知道有什么解决办法, 因为真机调试是编译过的,我就使用 weakSet 来监听页面(不知道能在 skyline 用嘛), 然后我真机反复执行 N 次后,最后看内存其实是稳定在一个范围,不会触发闪退, 但是我 GC 后, 页面仍然不会消除,而我这边实际业务逻辑代码很复杂,出现过 闪退的情况,所以我就不知道我该怎么办了 ,如果知道是哪些页面的问题,又该如何进行改进。
我额外使用 阻止页面释放(webview 下是可行的),结果跟没阻止一样, skyline 下 同样的表现存放的 this 没有释放, 内存也会稳定在一个范围。
getApp().userInfoChangeListener = (userName) => {
this.setData({userName})
}
languageListener = ({lang}) => {
this.setData({lang})
}
如果 ComponentCaller 无法回收的话,需要先排除下是否是因为小程序本身的 js 逻辑导致的内存泄漏。 排查方法如下:
在微信开发者工具上点击真机调试,选择真机调试2.0,选择安卓系统(目前仅安卓支持获取内存快照)
手机扫码进行操作。例如:进入页面,退出页面。 操作结束后,点击内存面板,抓取内存快照。
在 snapshot 里搜索 ComponentCaller,带有 route 字段说明是 Page 实例。 如果后退推掉的页面实例仍在内存快照里,说明存在内存泄漏。 可选择对应的页面实例,在下方查看引用关系。(有全局对象、全局数组直接或间接引用到 ComponentCaller 实例就会造成内存泄漏)
验证:解决内存泄漏问题后,再次抓取内存快照检查实例是否已被回收。