Node.JS内存泄漏与PM2
我正在运行我的服务器与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显示3GB+
?
现在切换到forever
或monit的东西,看看泄漏是否仍然存在。
多一点背景
- 我一直在试图分析和发现泄漏,并不只是在configuration文件上显示任何泄漏。
- memwatch diff是在客户端连接时启动的,当客户端断开连接时会产生差异。
- 我也面临同样的问题,但经过一番研究,我发现nodejs在使用pm2时不会调用垃圾回收器。
- 所以,直到PM2修复这个问题临时工是强制呼叫垃圾收集器,使用以下
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的气泡泄漏问题。