追踪 Vue.js 服务器端渲染中的内存泄漏?
Tracking down memory leak in Vue.js server-side rendering?
我们有一个 Vue.js (v2.2.6) 应用程序 运行 在生产中使用基于 Hacker News demo app structure 的服务器端渲染。我们遇到了内存泄漏导致进程 运行 内存不足并在大约 6-12 小时后崩溃,我们已经开始在服务器上拍摄堆快照以尝试跟踪问题。
但是,我们已经研究了这些内容好几天了,但一无所获。突出的一点(正如您在下面的屏幕截图中看到的那样)是 VueComponent
和 Vue
的许多实例正在创建并且从未从内存中删除。我对 Vue 的服务器端渲染的内部结构了解不够,无法知道这是否是一个真正的线索,如果是的话,从哪里可以看到。
有没有人 运行 遇到过这样的事情,或者有任何想法可以帮助我们确定是什么导致了这种情况?
我最终通过切换到比单独使用堆快照更强大的调试工具来跟踪这个问题:LLDB 和 llnode 插件。如果您使用过 Joyent 的 SmartOS 和 mdb,这应该非常熟悉,并且它为您提供了比标准堆快照更多的数据。
我使用 dumpme 节点模块在我的生产应用程序中触发核心转储(还有其他方法可以做到这一点,但我发现这最简单)。
然后我按照 https://developer.ibm.com/node/2016/09/27/advances-in-core-dump-debugging-for-node-js/ 中的说明开始跟踪对保存在内存中的 VueComponents 的引用。
> lldb node -c core
(lldb) plugin load ./node_modules/llnode/llnode.so
(lldb) v8 findjsobjects
(lldb) v8 findjsinstances VueComponent
(lldb) v8 inspect ...
在这种情况下,事实证明有一个递归的 setTimeout 在组件被销毁时永远不会被清除,所以对整个应用程序的引用留在内存中。
我们有一个 Vue.js (v2.2.6) 应用程序 运行 在生产中使用基于 Hacker News demo app structure 的服务器端渲染。我们遇到了内存泄漏导致进程 运行 内存不足并在大约 6-12 小时后崩溃,我们已经开始在服务器上拍摄堆快照以尝试跟踪问题。
但是,我们已经研究了这些内容好几天了,但一无所获。突出的一点(正如您在下面的屏幕截图中看到的那样)是 VueComponent
和 Vue
的许多实例正在创建并且从未从内存中删除。我对 Vue 的服务器端渲染的内部结构了解不够,无法知道这是否是一个真正的线索,如果是的话,从哪里可以看到。
有没有人 运行 遇到过这样的事情,或者有任何想法可以帮助我们确定是什么导致了这种情况?
我最终通过切换到比单独使用堆快照更强大的调试工具来跟踪这个问题:LLDB 和 llnode 插件。如果您使用过 Joyent 的 SmartOS 和 mdb,这应该非常熟悉,并且它为您提供了比标准堆快照更多的数据。
我使用 dumpme 节点模块在我的生产应用程序中触发核心转储(还有其他方法可以做到这一点,但我发现这最简单)。
然后我按照 https://developer.ibm.com/node/2016/09/27/advances-in-core-dump-debugging-for-node-js/ 中的说明开始跟踪对保存在内存中的 VueComponents 的引用。
> lldb node -c core
(lldb) plugin load ./node_modules/llnode/llnode.so
(lldb) v8 findjsobjects
(lldb) v8 findjsinstances VueComponent
(lldb) v8 inspect ...
在这种情况下,事实证明有一个递归的 setTimeout 在组件被销毁时永远不会被清除,所以对整个应用程序的引用留在内存中。