问题描述
自定义组件实例没有被销毁,如果给组件的 properties 传递了大量数据(Demo 中是 500k),将快速占用内存。
复现步骤
1.打开 Demo,然后打开开发者工具的 Memory 面板,录取内存快照,关注构造函数:l。
2.点击 Click 按钮 10 次(相当于渲染、隐藏自定义组件 foo 5 次),然后点击强制垃圾回收按钮,接着再次录取内存快照。
3.选中快照 Snapshot2,filter 设置为:Objects allocated between Snapshot1 and Snapshot2,并筛选构造函数:l。这时可以观察到内存占用大幅上升,其中新增的 5 个对象 l 引用了 32% 的内存。
4.展开其中一个 l 对象,可以观察到其 __methodCaller 属性引用的是一个自定义组件实例,从而判断 l 对象跟自定义组件有关。再观察 l 对象中内存占比较大的字段分别是 __vtObj 与 __innerData,它们都分别引用着父组件传入的 json 属性(500k 大数据)。( l 对象的 Retainers 是一些循环引用或内部代码,很难再往下追查)
5.右键点击 l 对象,选择 Store as a global variable,把 l 对象放到控制台进行观察,发现 __vtObj 与 __innerData 属性引用的是独立的 json 对象。
6.综上,推测自定义组件实例没有被销毁,如果给自定义组件的 properties 传递了大型数据,会导致内存泄露问题更明显。
环境信息
- 基础库:2.32.2
- 复现环境:微信开发者工具(真机调试不支持堆栈 snapshot)
反馈已收到。我们仔细分析下。
内存泄露导致页面白屏严重
碰到了相同的情况,在 prop 传递数据量较大的对象时,泄露情况更加明显,希望小程序官方能尽早帮忙看一看~谢谢
有临时处理方案吗?
修改后的 Demo 地址:demo2
复现步骤同上。
当通过 template 的方式使用自定义组件时,会存在内存泄露的情况。
1. 有一个 wx:if / wx:for 节点,节点内有 template is 节点;
2. template 实现中包含有自定义组件节点。
可能导致自定义组件未释放(及一些其他问题)。
我们会尽快修复。
相同状况