首页 > 解决方案 > Aurelia 自定义元素不是在 chrome 中收集的垃圾

问题描述

我在我的 Aurelia 应用程序中发现了内存泄漏,我完全迷失了,其中一些自定义元素没有被垃圾收集器从对象图中删除。

我使用 Chrome DevTools 内存快照工具来跟踪所有引用,并且能够删除所有引用。至少我在开发工具中找不到任何引用自定义元素的黄色节点。现在我只有很多未清理的分离节点。

在此处输入图像描述

有谁知道找到这些参考的另一种方法?

我尝试使用 npm 模块并在自定义元素上heapsnapshot使用该功能。pathToRoot此函数递归搜索根元素的路径。甚至这个函数也告诉我我的自定义元素实例没有根路径。那么为什么它还在记忆中呢?

如果有人想尝试找到解决方案,我可以从 chrome 提供堆快照。

标签: javascriptgoogle-chromememory-managementmemory-leaksaurelia

解决方案


实际上,今天我在 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:不要只记录对象,因为它们将引用到开发控制台。最好根据对象中的值创建要记录的新字符串。


推荐阅读