8

最近,我安装了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 的想法,但我找不到参考链接),但我看到内存使用量在不断增加。确实需要解决。

4

1 回答 1

3

V8中有3种GC事件

  • kGCTypeMarkSweepCompact
  • kGCTypeScavenge
  • kGCTypeAll

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

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

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

require('nodefly-gcinfo').onGC(function(usage, type, flags){
    console.log("GC Event Occurred");
    console.log("Heap After GC:",usage, type, flags);
});
于 2013-01-20T04:49:46.510 回答