Node.JS内存泄漏PM2

时间:2015-02-15 01:27:40

标签: node.js memory-leaks

我使用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+


现在切换到forevermonit,以查看泄漏是否仍然存在。


多一点背景

  • 我一直在尝试剖析并发现泄漏,并且没有任何泄漏显示在配置文件上。
  • 当客户端连接时启动memwatch diff,并在客户端断开连接时进行区分。

3 个答案:

答案 0 :(得分:5)

  • 我也遇到了同样的问题,但经过一些研究后我发现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 meomry泄漏问题。

答案 1 :(得分:1)

运行PM2的应用程序完全没有泄漏

Memory usage over time of application managed by PM2

与PM2本身相同:

PM2 Monitoring itself

答案 2 :(得分:-1)

此线程上有很多非常不好的答案。真的,真的很糟糕。

答案很简单:您的代码存在内存泄漏,您需要查找并删除它,而且非常不恰当的是,GC错误,很可能是您的代码是罪魁祸首。 < / p>

所以首先:

  1. 我发现PM2的垃圾收集器不起作用”-这是 PM2显然是荒谬的,它运行使用V8的节点,该节点具有 内置垃圾收集器。这不仅仅因为您而被禁用 运行PM2。
  2. 因此,在解决该问题之前,请致电GC ”-不!如果您的代码有泄漏,则手动调用GC很懒,应该修复它们。
  3. 在删除pm2之后,现在没有更多的内存泄漏。”-不,您只是不在PM2中监视它;而是泄漏仍然存在,您只是看不到错误,因为您正在使用node运行该错误,而不查看结果。

第二,实际解决方案应该是:

  

使用您的工具配置代码的内存和CPU使用情况   选择。对于大多数人来说,这将是Chrome的调试工具   连接到正在运行的节点实例,并查看哪些功能   导致内存使用量激增。只需手动调用GC   之所以懒惰是因为您的代码仍然有泄漏,但是您只是告诉V8   在您的应用程序泄漏内存后不断地对其进行存储,这是很懒的做法。