Node.js 中的垃圾收集器

6
根据谷歌的说法,V8采用一种高效的垃圾回收方法,通过使用“停止-世代-精确-垃圾收集器”来实现。其中一部分声明是在执行垃圾回收周期时,V8会停止程序的执行。
一个显而易见的问题是,当暂停程序执行时,如何实现高效的GC?
我试图找到更多关于这个主题的信息,因为我想知道当您的node.js服务器可能有成千上万的请求每秒时,GC如何影响响应时间。
非常感谢任何专家帮助、个人经验或链接。
谢谢。
1个回答

13
“高效”可以有几种含义。在这里,它可能指的是高吞吐量。当考虑响应时间时,您更关心延迟,而使用其他GC策略可能会比这个更糟糕。
停止整个世界(stop-the-world)GC的主要替代方案是:
  • 增量GC,它们不需要在完成收集周期之前暂时将控制权交还给mutator1,以及
  • 并发GC,它们(虚拟地)与mutator同时运行,仅在极短的时间内中断mutator(例如扫描堆栈)。
两者都需要执行额外的工作,以便在面对堆的并发修改时保持正确性(例如,如果创建了一个新对象并将其附加到已经扫描过的对象,则必须注意到这个新引用)。这会影响总吞吐量,即实际清理整个堆所需的时间更长。好处是它们通常不会(或很少)中断程序,因此延迟较低。

尽管 V8 文档仍提到了 stop-the-world 垃圾回收器,但自 2011 年以来,V8 GC 已经成为增量式的。因此,虽然它偶尔会让程序暂停执行,但它并不会花费很长时间来扫描整个堆。相反,它可以扫描一两毫秒,并让程序恢复。

1 "Mutator" 是垃圾回收术语,指的是进行堆垃圾回收的程序。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接