跟踪Vue.js服务器端呈现中的内存泄漏?

时间:2017-03-31 14:32:29

标签: javascript memory-leaks vue.js vue-server-renderer

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

然而,我们已经挖了好几天,并没有真正得到任何地方。突出的事情(正如您在下面的屏幕截图中看到的)是,有许多VueComponentVue$2的实例被创建并且永远不会从内存中删除。我对Vue服务器端渲染的内部结构知之甚少,不知道这是真正的引导,也不知道从哪里开始。

enter image description here enter image description here

有没有人碰到这样的事情,或者有什么想法可以确定导致这种情况的原因?

1 个答案:

答案 0 :(得分:5)

我终于通过切换到比单独使用堆快照更强大的调试工具来跟踪这个问题: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在组件被销毁时从未被清除,因此对整个应用程序的引用保留在内存中。