【问题标题】:timing for node.js Garbage Collectionnode.js 垃圾回收的时机
【发布时间】:2012-07-11 23:45:25
【问题描述】:

最近,我安装了https://github.com/lloyd/node-memwatch 用于开发,研究GC如何与我的程序交互。

我已经绑定了“stat”事件,作者说GC执行时触发了该事件。

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

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

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

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

【问题讨论】:

  • 你确定你实际上没有内存泄漏吗?
  • 嘿,你的问题解决了吗?我还遇到重载时内存不断增加...
  • 不,我已经放弃使用 node.js。我已经改用 Erlang。

标签: node.js garbage-collection


【解决方案1】:

V8 中有 3 种 GC 事件

  • kGCTypeMarkSweepCompact
  • kGCTypeScavenge
  • kGCTypeAll

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 2016-08-17
    • 2011-07-16
    • 2016-01-29
    • 1970-01-01
    • 2011-12-21
    • 2012-01-28
    • 2013-06-27
    • 2011-11-29
    相关资源
    最近更新 更多