wepy icon indicating copy to clipboard operation
wepy copied to clipboard

wepy2.0,页面 Unload 后,WepyPage 和 WepyComponent 一直留存在内存中,多次重复导致小程序崩溃闪退

Open foxpsd opened this issue 4 years ago • 4 comments

Description

[问题描述:站在其它人的角度尽可能清晰地、简洁地把问题描述清楚]

很好复现,有页面A和页面B,A 跳转 B,然后左上角返回,此时页面 B 应当 unload 了,此时用开发者工具的 memory 查看,发现内存中依然留存有两个 WepyPage 实例,如图。 image 再进入页面 B,再推出,重复多次操作,发现堆栈中的 wepyPage 和 wepyComponent 实例越来越多(内部的 watcher, dep 更多),内存占用也水涨船高。如图。 image

真机中使用时,如果访问数据结构复杂的页面,在差一点的手机(如6S)上,稳定几次就会闪退。

查看 wepy 源码中发现没有 destroy 相关的方法,仿照 vue 2.x 写了一个 destory 方案并在页面 unload 中调用,尝试将 wepyPage 实例中的各种引用置空,watcher teardown,依旧没用。wepyPage 和由它带来的一系列数据依旧在内存中没有被回收。请问这种情况是正常的么?有什么解决思路?

Environment

  • Platform: [开发者工具/iOS/Andriod]
  • Platform version: [所有]
  • Wechat version: [所有]
  • wepy version: [2.1.0]

foxpsd avatar Dec 03 '20 07:12 foxpsd

另外,watcher 的源码中,有:

if (!this.isRenderWatcher) this.cleanupDeps();

this.isRenderWatcher 目测是页面所属 watcher 的标识符,这就意味着页面 watcher 的依赖永远不会清理。在上面的操作下,A 页面的 newDepIds 和 newDeps 会越来越长,也是一个严重的性能问题

foxpsd avatar Dec 03 '20 09:12 foxpsd

@foxpsd 我也遇到这个问题了,总是闪退,请问您是怎么解决的啊

mSoftDeveloper avatar May 09 '21 03:05 mSoftDeveloper

@foxpsd 同遇到了,组件级、页面级的watch监听不随着销毁卸载。 表现不同,原因是一样的

mikasayw avatar Jun 02 '21 08:06 mikasayw

同遇到了,watch不随组件销毁,会触发多次 @foxpsd 请问解决了吗

Pasoul avatar Jul 21 '22 09:07 Pasoul