javascript - Aurelia 自定义元素不是在 chrome 中收集的垃圾
问题描述
我在我的 Aurelia 应用程序中发现了内存泄漏,我完全迷失了,其中一些自定义元素没有被垃圾收集器从对象图中删除。
我使用 Chrome DevTools 内存快照工具来跟踪所有引用,并且能够删除所有引用。至少我在开发工具中找不到任何引用自定义元素的黄色节点。现在我只有很多未清理的分离节点。
有谁知道找到这些参考的另一种方法?
我尝试使用 npm 模块并在自定义元素上heapsnapshot
使用该功能。pathToRoot
此函数递归搜索根元素的路径。甚至这个函数也告诉我我的自定义元素实例没有根路径。那么为什么它还在记忆中呢?
如果有人想尝试找到解决方案,我可以从 chrome 提供堆快照。
解决方案
实际上,今天我在 3 天后找到了解决方案!我使用分析工具的方式是正确的,但我没有想到对开发工具的引用也会阻止垃圾收集。我有app.js
一个事件侦听器来检测当前页面并将其呈现为我的router-view
. 在这个监听器中,有一个日志记录,它使用调试方法记录指令,然后在开发工具的日志输出和指令之间创建一个引用,因此是对所有子视图的引用。
ea.subscribe('router:navigation:complete', ({instruction}) => {
log.debug('Main route switched', instruction); // <<<<<<<<<<< Memory leak
this.currentRoute = instruction.router.currentInstruction && instruction.router.currentInstruction.config.name;
});
TL;DR:不要只记录对象,因为它们将引用到开发控制台。最好根据对象中的值创建要记录的新字符串。
推荐阅读
- elasticsearch - 没有使用 Olivere Golang 将数据插入 ElasticSearch
- r - 应用两个元素的函数
- r - R中循环的优化
- sql-server - 如何将结果从 int SQL Server 转换为字符串
- java - 使用测试容器时“未找到可链接容器”
- angular - Angular 5 访问由 Angular 5 打开的窗口打开的外部窗口对象 url
- cordova - 添加多个链接以在 phonegap 应用程序上共享
- algorithm - ElasticSearch (5.5) 查询或算法需要根据带有干扰模式的时间戳提取值
- python - Python:IndexError:列表索引超出范围和语法错误
- c++ - 如何在eclipse中获取空格而不是制表符