Node.js中的垃圾收集器

时间:2013-03-11 08:32:43

标签: node.js garbage-collection v8

根据谷歌的说法,V8采用了“停止世界,世代,精确,垃圾收集器”的高效垃圾收集。声明的一部分是V8在执行垃圾收集循环时停止程序执行。

一个显而易见的问题是,当您暂停程序执行时,如何才能拥有高效的GC?

我试图找到更多关于这个主题的信息,因为我有兴趣知道当你每秒有数十个thounsands请求触发node.js服务器时,GC会如何影响响​​应时间。

非常感谢任何专家帮助,个人经验或链接

谢谢

1 个答案:

答案 0 :(得分:13)

“高效”可能意味着几件事。这里它可能指的是高吞吐量。在查看响应时间时,您对延迟更感兴趣,这确实比使用其他GC策略更糟糕。

阻止世界各地的GC的主要替代方案是

  • 增量GC,在暂时将控制权交还给mutator 1
  • 之前无需完成收集周期,
  • 并发GC,它(实际上)同时操作作为mutator,只是非常短暂地中断它(例如扫描堆栈)。

在面对并发修改堆时,两者都需要执行额外的工作才能正确(例如,如果创建新对象并将其附加到已扫描的对象,则必须注意此新引用)。这会影响总吞吐量,即实际清理整个堆需要更长的时间。好处是它们(通常)不会(通常)中断程序很长时间,如果有的话,所以延迟很低(呃)。

尽管V8文档仍然提到了一个世界级的收藏家,但自2011年以来它似乎是V8 GC is incremental。所以虽然偶尔会停止执行程序,但不会 2 停止程序,无论扫描整个堆多长时间。相反,它可以扫描几毫秒,然后让程序恢复。

1 “Mutator”是垃圾收集堆程序的GC术语。

2 至少在原则上,这可能是可配置的。