【发布时间】:2019-10-01 23:26:15
【问题描述】:
问题
https://github.com/nativescript-vue/nativescript-vue/issues/492
简介
在 Nativescript-Vue 中使用自定义选项卡路由策略,我发现我的应用程序正在泄漏内存。路由策略依赖于一个总体组件,该组件将通过 v-if 语句切换活动组件。当用户导航到新页面时,v-if 语句将隐藏(并销毁)旧页面并显示(并挂载)新页面。理论上应该是旧页被销毁,内存被垃圾回收器回收;然而,实际上内存会堆积起来,似乎永远不会从应用程序中释放出来,即使手动调用垃圾收集器也是如此。
测试和复制
这个问题是在一个真正的 ios 设备上测试和发现的(模拟器似乎没有内存问题,但我读到它不像一个真正的设备)。上面提供的 github 问题可以提供更多详细信息,下面链接的存储库演示了导致内存泄漏的最小复制。
可以在https://github.com/geodav-tech/nativescript-vue-memory-leak 找到此错误的重现。
在构建项目后,通过 xcode 运行它,查看内存配置文件,然后从状态列表来回导航到安装时生成的示例列表。自述文件中还提供了屏幕截图
我希望隐藏组件的内存在它们被销毁后被清理,目前即使您让应用程序打开几分钟,垃圾收集器也不会减少负载。
问题(编辑)
是否有人对应用程序持有的内存有任何理由?有没有更好的方法来完成类似这样的路由策略,不会导致内存泄漏,或者程序流的某些事情是一个糟糕的策略?
【问题讨论】:
-
可能更合适的方式是把这个以关于原始问题的问题的形式发布,然后提交您当前帖子的内容作为答案并接受它。这将避免让这个“问题”处于开放状态,将其保持在 SO 问题的普通格式内,并且可能会让其他人在未来更容易找到此信息。
-
您是否尝试使用
hide()或destroy()方法来避免它?更多示例可以在这里找到:vuejs.org/v2/cookbook/avoiding-memory-leaks.html -
我不确定我是否遵循,因为该示例中列出的销毁方法来自外部库。在我提供的复制品中应该没有什么可以破坏的。它是一个随机 id 和增量名称的数组。在销毁之前将此数组设置为 null 或空数组也不会影响内存节省。我只使用 vanilla javascript 和 nativescript-vue 创建了复制存储库。没有要调用的外部
destroy()。
标签: vue.js memory memory-leaks nativescript nativescript-vue