4

我们有一个 Vue.js (v2.2.6) 应用程序在生产中运行,基于Hacker News 演示应用程序结构的服务器端渲染。我们遇到了内存泄漏,导致进程在大约 6-12 小时后耗尽内存并崩溃,我们已经开始在服务器上拍摄堆快照以尝试跟踪问题。

但是,我们已经研究了这些天,但还没有真正得到任何地方。突出的一点(如您在下面的屏幕截图中所见)是有许多实例被创建VueComponent并且Vue$2从未从内存中删除。我对 Vue 的服务器端渲染的内部结构了解得不够多,不知道这是否是真正的线索,以及如果是的话,从哪里看。

在此处输入图像描述 在此处输入图像描述

有没有人遇到过这样的事情,或者有什么想法可以让我们确定是什么原因造成的?

4

1 回答 1

6

我最终通过切换到一个比单独使用堆快照更强大的调试工具来追踪这一点: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,因此对整个应用程序的引用保留在内存中。

于 2017-04-21T22:43:00.180 回答