2017-03-31 156 views
3

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

但是,我们一直在挖掘这些天,并没有真正得到任何地方。 (在下面的屏幕截图中可以看到)的事情是有很多VueComponentVue$2的实例正在创建,并且永远不会从内存中删除。我对Vue的服务器端渲染的内部知识不够了解,以了解这是否是真正的主角,以及如果是真的,从哪里看。

enter image description here enter image description here

有没有人遇到这样的事情,或有任何想法,我们可能看起来决定可能会造成什么呢?

+0

也许https://github.com/vuejs/vue/issues/5089? –

+0

我看到了,但我们没有任何全局mixin。 –

回答

2

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