Aurelia 自定义元素未在 chrome 中被垃圾收集

Aurelia custom element not garbage collected in chrome

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

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

有谁知道另一种查找这些参考文献的方法吗?

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

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

其实今天我在三天后找到了解决方案!我使用分析工具的方式是正确的,但我并没有想到对开发工具的引用也会阻止垃圾收集。我在我的 app.js 中有一个事件侦听器来检测当前页面并将其呈现为我的 router-view 上的 class。在这个监听器中有一个日志记录,它使用调试方法记录指令,然后在开发工具的日志输出和指令之间创建引用,因此引用所有子视图。

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