y***@163.com
y***@163.com
  • 发布:2020-01-28 19:56
  • 更新:2020-04-27 11:34
  • 阅读:1598

【严重Bug!!-内存泄漏】自定义组件使用 v-for 数组变化长度时候 会内存泄漏 !!

分类:uni-app

详细问题描述

如下 custom 是自定义组件 , list 是数组, 当list 变化长度时候, 会内存泄漏

  <custom v-for="(item, i) in list" :key="i" :info="item"></custom>

以及长度不变, 绑定的 key 不断变化时候, 也会内存泄漏

 <custom v-for="item in list" :key="item.id" :info="item"></custom>

目前已经测试的是 微信小程序会内存泄漏

H5 没有问题

附件有完整的测试工程

2020-01-28 19:56 负责人:无 分享
已邀请:
y***@163.com

y***@163.com (作者)

HBuilderX 版本: 2.5.7.20200116-alpha

y***@163.com

y***@163.com (作者)

这问题没人管吗? 微信小程序总出现内存不足 闪退!! 过年花了足足2天一步步跟踪尝试才找到了具体原因. 就没人管了... .????

  • DCloud_UNI_FXY

    你是用微信小程序真机运行,测试的内存不足?你可以把你的demo,改成原生小程序的写法,看看是不是一样存在内存泄漏

    2020-02-23 15:47

  • y***@163.com (作者)

    回复 DCloud_UNI_FXY: 目前我采用的加 v-if="list" 先把 数组先设置为 null后,nextTick在赋新值的做法, 这样在长时间测试中没有内存泄漏. list为null 后 v-if 把节点清空了. 但是会闪烁利用一些动画掩盖了. 我发现 uniapp 使用diff 后setData , 绑定的 key 如果变化. 在微信小程序中 无法删除 _idNodeMap 中的node ,导致内存泄漏. uniapp 能不能提供一个标记某个 data属性不使用 diff 而是全量更新. 这样应该就没问题了

    2020-02-24 11:39

  • y***@163.com (作者)

    回复 DCloud_UNI_FXY: https://img-cdn-qiniu.dcloud.net.cn/uploads/answer/20200224/a56bc8d795848b3d35875ce88b4b35c1.png

    2020-02-24 11:53

  • DCloud_UNI_FXY

    回复 y***@163.com: 根据你的排查,看起来应该是因为diff数据,对数组局部差量更新时,微信内部没有处理好销毁,导致的内存泄漏.

    2020-02-24 13:27

y***@163.com

y***@163.com (作者)

补个图

DCloud_UNI_FXY

DCloud_UNI_FXY

增加diff开关

HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/mp-vue/dist/mp.runtime.esm.js

var diffData = diff(data, mpData);

修改为

var diffData = this.$shouldDiffData === false ? data : diff(data, mpData);

当在vue中修改数据时,想禁用diff,设置this.$shouldDiffData = false来关闭,仅对本vm生效
你调整测试下,是否可以解决因为diff导致的内存泄漏。

y***@163.com

y***@163.com (作者)

还是会内存泄漏, 与diff没多大关系,应该是 微信小程序内部机制有问题. 目前我发现的能有效解决整个问题的是 每次更改前先赋值null 通过 v-if清理下 node , 再赋新值. 还可以通过重新 加载页面来解决. 以下是两张内存对比图,

第一张是直接修改 数组,内存泄漏. (禁用diff 也一样), 第二张图是先赋值null 在赋值新值,不再内存泄漏.

我的应用正好遇到需要长时间再同一个页面, 频繁刷新列表的应用场景. 所以内存泄漏会很明显.

  • y***@163.com (作者)

    另外补充以下跟自定义组件有关, 内置组件 没发现这样的问题. 也许可以通过把组件全部展开到最外层, 不使用自定义组件来解决整个问题.

    2020-02-24 19:55

  • DCloud_UNI_FXY

    回复 y***@163.com: 那可以向微信官方反馈下,应该是他们内部实现存在问题,导致部分节点对象一直没释放

    2020-02-24 20:16

8***@qq.com

8***@qq.com

app 是不是也有类似的问题

该问题目前已经被锁定, 无法添加新回复