【问题标题】:Tracking down memory leak in Vue.js server-side rendering?跟踪 Vue.js 服务器端渲染中的内存泄漏?
【发布时间】:2017-03-31 14:32:28
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2016-10-30
    • 2011-02-20
    相关资源
    最近更新 更多