node.js垃圾收集的时间

Har*_*han 8 garbage-collection node.js

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

我已将事件"stat"绑定,arthor声明在执行GC时会触发事件.

我发现当脚本负载很高时.不会触发"stat"事件.我不确定它是否意味着GC没有执行,但它表明GC可能没有触发.

在我的生产服务器中,全天的装载量甚至更高.我很确定GC没有机会表演.内存使用量没有机会减少.就像内存泄漏一样.

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

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

Jac*_*ter 2

V8中有3种GC事件

  • kGCTypeMarkSweepCompact
  • kGCTypeScavenge
  • kGCTypeAll

V8 经常运行 scavenge 事件,但仅限于新创建的对象。在重负载期间,其他类型的 GC 可能很少发生。

您可以尝试运行NodeFly代理,它使用nodefly-gcinfo 模块来跟踪持续的内存使用情况。

您还可以直接调用nodefly-gcinfo,它有一个每次 GC 事件发生时运行的回调:

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