收藏
回答

skyline 内存泄漏如何解决 ?

基础库: 3.7.7

我参照

https://developers.weixin.qq.com/community/develop/doc/000ae8dd1bcdc093e061dcdbb61c00?highLine=%25E4%25BB%25A3%25E7%25A0%2581%25E6%25B3%2584%25E6%25BC%258F%25E5%25A4%2584%25E7%2590%2586

代码片段, 在开发者工具运行是可以可以复现,即页面没有被销毁,真机调试重复进入页面内存会递增, 使用 GC 后也没有减少,因为代码比较简单,不存在跨引用的场景, 我使用 webview 加载内存是正常回收的,我不知道有什么解决办法, 因为真机调试是编译过的,我就使用 weakSet 来监听页面(不知道能在 skyline 用嘛), 然后我真机反复执行 N 次后,最后看内存其实是稳定在一个范围,不会触发闪退, 但是我 GC 后, 页面仍然不会消除,而我这边实际业务逻辑代码很复杂,出现过 闪退的情况,所以我就不知道我该怎么办了 ,如果知道是哪些页面的问题,又该如何进行改进。



我额外使用 阻止页面释放(webview 下是可行的),结果跟没阻止一样, skyline 下 同样的表现存放的 this 没有释放, 内存也会稳定在一个范围。

getApp().userInfoChangeListener = (userName) => {

        this.setData({userName})

    }

    languageListener = ({lang}) => {

this.setData({lang})

    }


回答关注问题邀请回答
收藏

2 个回答

  • Eric Huang
    Eric Huang
    置顶回答02-10

    如果 ComponentCaller 无法回收的话,需要先排除下是否是因为小程序本身的 js 逻辑导致的内存泄漏。 排查方法如下:

    在微信开发者工具上点击真机调试,选择真机调试2.0,选择安卓系统(目前仅安卓支持获取内存快照)

    手机扫码进行操作。例如:进入页面,退出页面。 操作结束后,点击内存面板,抓取内存快照。

    在 snapshot 里搜索 ComponentCaller,带有 route 字段说明是 Page 实例。 如果后退推掉的页面实例仍在内存快照里,说明存在内存泄漏。 可选择对应的页面实例,在下方查看引用关系。(有全局对象、全局数组直接或间接引用到 ComponentCaller 实例就会造成内存泄漏)

    验证:解决内存泄漏问题后,再次抓取内存快照检查实例是否已被回收。

    02-10
    有用
    回复 1
  • 智能回答 智能回答 该问答由AI生成
    02-08
    有用
登录 后发表内容