【问题标题】:Garbage collector in Node.jsNode.js 中的垃圾收集器
【发布时间】:2013-03-11 08:32:42
【问题描述】:

根据谷歌的说法,V8 通过采用“停止世界、分代、准确、垃圾收集器”来实现高效的垃圾收集。部分声明是 V8 在执行垃圾回收周期时会停止程序执行。

一个明显的问题是,当您暂停程序执行时,如何进行高效的 GC?

我试图找到有关此主题的更多信息,因为我想知道当您每秒可能有数万个请求触发您的 node.js 服务器时,GC 如何影响响​​应时间。

任何专家的帮助、个人经验或链接将不胜感激

谢谢

【问题讨论】:

    标签: node.js garbage-collection v8


    【解决方案1】:

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

    stop-the-world GC 的主要替代品是

    • 增量 GC,在将控制权临时交还给 mutator1 之前不需要完成一个收集周期,并且
    • 并发 GC(实际上)同时作为 mutator 运行,仅非常短暂地中断它(例如扫描堆栈)。

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

    虽然 V8 文档仍然提到了一个停止世界的收集器,但似乎是自 2011 年以来的 V8 GC is incremental。因此,虽然它确实偶尔会停止程序执行,但它确实不会 2 停止程序扫描整个堆所需的时间。相反,它可以扫描几毫秒,然后让程序继续运行。

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 2014-02-05
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2011-07-16
      • 2016-01-29
      相关资源
      最近更新 更多