PM2启动nuxt应用,内存溢出(一出乌龙)

2,744 阅读1分钟

问题描述

用nuxt新建一个SSR项目,根据SSR输出的html生成pdf。

用pm2启动服务。

通过程序连续调用200次生成接口,内存迅速升高,一路飙到1.4G, 然后自动重启。

通过heapdump查看内存snapshot

1)生成.snapshot文件

// nuxt.config.js中增加配置
var headpdump = require('heapdump')

setTimeout(function () {
    headpdump.writeSnapshot('/tmp/' + Date.now() + '.heapsnapshot', function(err, filename) {
        console.log('dump written to', filename)
    })
}, 3 * 60000)

2)chrome 调试器中momery模块load生成的.snapshot文件(会持续增加到1.4G)

查看具体内容,发现里面的闭包引用异常:

vueRouter.push()方法引用过多,最后定位到.nuxt中的router.js

里面有一段对push方法的重写,

// TODO: remove in Nuxt 3
const emptyFn = () => {}
const originalPush = Router.prototype.push
Router.prototype.push = function push (location, onComplete = emptyFn, onAbort) {
  return originalPush.call(this, location, onComplete, onAbort)
}
本地的这段代码注释掉后,问题解决了,内存没有再飙升。

但是部署到服务器上后,问题 依然存在

请忘记上面的一顿分析,我自己也被带偏了。

真正的罪魁祸首

pm2 启动应用的时候,想当然的用了项目 server/index.js这个node的启动文件。

pm2 start server/index.js

用了上面这段命令启了服务,居然也没有什么报错。

解决方案:修改pm2启动命令:

package.json中加入: "publish": "nuxt build && npm start"

pm2启动命令:pm2 start npm --name "your project name" -- run publish

解决了!

ps: 出问题的启动方式(pm2 start server/index.js),压根就没有走正常的打包启动流程!