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