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的气泡泄漏问题。