时间为node.js垃圾收集

最近,我已经安装了https://github.com/lloyd/node-memwatch进行开发,以调查GC如何与我的程序进行交互。

我已经把“stat”这个事件绑定了,arthor声明这个事件是在GC执行时触发的。

我发现,当脚本高负载。 “stat”事件不会被触发。 我不确定这是否意味着GC没有执行,但这是一个GC可能没有触发的迹象。

在我的生产服务器上,整个一天的负载甚至更高。 我很确定GC没有机会表演。 内存使用量没有减less的机会。 这就像内存泄漏。

  1. 我的观察是否正确? GC持续高负荷时不能执行吗?
  2. 如果是这样,我应该使用暴露的GC接口强制GC?
  3. GC阻塞? 我是否应该更频繁地执行GC,以便GC不会长时间阻塞每个GC?

我知道手工GC是不是一个好主意(有人反对node.js手动GC的想法,但我找不到链接的参考),但我看到内存使用量不断增加。 这确实需要解决。

V8中有3种types的GC事件

  • kGCTypeMarkSweepCompact
  • kGCTypeScavenge
  • kGCTypeAll

V8经常运行扫描事件,但只能在新创build的对象上运行。 其他types的气相色谱在重载时可能不经常发生。

您可以尝试运行使用nodefly-gcinfo模块的NodeFly代理来跟踪正在进行的内存使用情况。

您也可以直接调用nodefly-gcinfo ,每次发生GC事件时都会运行一个callbacknodefly-gcinfo

 require('nodefly-gcinfo').onGC(function(usage, type, flags){ console.log("GC Event Occurred"); console.log("Heap After GC:",usage, type, flags); });