根据谷歌的说法,V8 通过采用“停止世界、分代、准确、垃圾收集器”来使用高效的垃圾收集器。部分声称是 V8 在执行垃圾回收周期时停止程序执行。
一个明显的问题是,当您暂停程序执行时,如何才能获得高效的 GC?
我试图找到有关此主题的更多信息,因为我很想知道当您每秒可能有数万个请求触发您的 node.js 服务器时,GC 如何影响响应时间。
任何专家帮助、个人经验或链接将不胜感激
谢谢
根据谷歌的说法,V8 通过采用“停止世界、分代、准确、垃圾收集器”来使用高效的垃圾收集器。部分声称是 V8 在执行垃圾回收周期时停止程序执行。
一个明显的问题是,当您暂停程序执行时,如何才能获得高效的 GC?
我试图找到有关此主题的更多信息,因为我很想知道当您每秒可能有数万个请求触发您的 node.js 服务器时,GC 如何影响响应时间。
任何专家帮助、个人经验或链接将不胜感激
谢谢
“高效”可能意味着几件事。这里大概指的是高吞吐量。在查看响应时间时,您对延迟更感兴趣,这确实可能比其他 GC 策略更糟糕。
stop-the-world GC 的主要替代方案是
面对堆的并发修改,两者都需要执行额外的工作才能正确(例如,如果创建了一个新对象并将其附加到已扫描的对象,则必须注意这个新引用)。这会影响总吞吐量,即实际清理整个堆需要更长的时间。好处是它们(通常)不会长时间中断程序,如果有的话,所以延迟很低(呃)。
尽管 V8 文档仍然提到了一个 stop-the-world 收集器,但似乎自 2011 年以来V8 GC是增量的。因此,虽然它确实偶尔会停止程序执行,但它不会 2停止程序多长时间扫描整个堆。相反,它可以扫描几毫秒,然后让程序恢复。
1 “Mutator”是堆被垃圾回收的程序的 GC 术语。
2至少在原则上,这可能是可配置的。