问题描述
用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)
查看具体内容,发现里面的闭包引用异常:
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),压根就没有走正常的打包启动流程!