收藏
回答

自定义组件没有被销毁,导致存在内存泄露的情况?

Demo 地址

问题描述

自定义组件实例没有被销毁,如果给组件的 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)
回答关注问题邀请回答
收藏

5 个回答

  • LastLeaf
    LastLeaf
    2023-07-04

    反馈已收到。我们仔细分析下。

    2023-07-04
    有用
    回复 3
    • LastLeaf
      LastLeaf
      2023-07-05
      调查了你的代码后发现是因为有个 console.log 把自定义组件的 this 本身打出来了。这会导致开发者工具 console 面板间接持有自定义组件对象。
      2023-07-05
      回复
    • 健
      2023-07-31
      感谢帮忙定位。已修改 Demo,发现仍存在内存泄露且与 <template> 有关,麻烦再帮忙看看的。
      2023-07-31
      回复
    • LastLeaf
      LastLeaf
      2023-07-31回复
      Demo 地址 更新了吗?
      2023-07-31
      回复
  • W
    W
    2023-06-26

    内存泄露导致页面白屏严重

    2023-06-26
    有用 1
    回复
  • Benectic.
    Benectic.
    2023-06-26

    碰到了相同的情况,在 prop 传递数据量较大的对象时,泄露情况更加明显,希望小程序官方能尽早帮忙看一看~谢谢

    2023-06-26
    有用 1
    回复
  • 健
    2023-07-31

    修改后的 Demo 地址:demo2

    复现步骤同上。

    当通过 template 的方式使用自定义组件时,会存在内存泄露的情况。

    2023-07-31
    有用
    回复 3
    • LastLeaf
      LastLeaf
      2023-07-31
      经分析已确认这个 bug 。触发条件:
      1. 有一个 wx:if / wx:for 节点,节点内有 template is 节点;
      2. template 实现中包含有自定义组件节点。
      可能导致自定义组件未释放(及一些其他问题)。
      我们会尽快修复。
      2023-07-31
      1
      回复
    • 健
      2023-08-02回复LastLeaf
      感谢~
      2023-08-02
      回复
    • 大海
      大海
      2023-09-05回复LastLeaf
      您好,这个问题解决了吗,在哪个版本修复的,我验证一下业务代码
      2023-09-05
      回复
  • 川页
    川页
    2023-06-28

    相同状况

    2023-06-28
    有用
    回复
登录 后发表内容