我使用pm2 start ...
运行我的服务器,pm2 monit
在2小时后向我显示3GB memory
。所以我附上了memwatch,现在又等了2个小时,pm2 monit
显示的记忆再次到达3GB
。
所以,我检查了生成的日志memwatch。告诉我:
{ before: { nodes: 75659, size_bytes: 11141702, size: '10.63 mb' },
after: { nodes: 73226, size_bytes: 10840598, size: '10.34 mb' },
change:
{ size_bytes: -301104,
size: '-294.05 kb',
freed_nodes: 5141,
allocated_nodes: 2708,
另一个:
{ before: { nodes: 72591, size_bytes: 10728318, size: '10.23 mb' },
after: { nodes: 73284, size_bytes: 10798062, size: '10.3 mb' },
change:
{ size_bytes: 69744,
size: '68.11 kb',
freed_nodes: 5931,
allocated_nodes: 6620,
现在我真的很困惑,那些是最后的日志,所以我很确定那些是pm2 monit
显示巨大内存泄漏时生成的日志。
那么,为什么memwatch
向我显示10MB+
内存,而pm2 monit显示为3GB+
?
现在切换到forever
或monit,以查看泄漏是否仍然存在。
多一点背景
答案 0 :(得分:5)
pm2 start app.js --node-args =' - expose-gc'
上面的参数 - expose-gc 将允许我们从节点js强制调用垃圾收集器,现在使用以下代码强制收集车库。
if (global.gc) {
global.gc();
} else {
console.log('Garbage collection unavailable. use --expose-gc '
+ 'when launching node to enable forced garbage collection.');
}
这将解决PM2 meomry泄漏问题。
答案 1 :(得分:1)
答案 2 :(得分:-1)
此线程上有很多非常不好的答案。真的,真的很糟糕。
答案很简单:您的代码存在内存泄漏,您需要查找并删除它,而且非常不恰当的是,GC错误,很可能是您的代码是罪魁祸首。 < / p>
所以首先:
第二,实际解决方案应该是:
使用您的工具配置代码的内存和CPU使用情况 选择。对于大多数人来说,这将是Chrome的调试工具 连接到正在运行的节点实例,并查看哪些功能 导致内存使用量激增。只需手动调用GC 之所以懒惰是因为您的代码仍然有泄漏,但是您只是告诉V8 在您的应用程序泄漏内存后不断地对其进行存储,这是很懒的做法。