node.js - Node.js 中的垃圾收集器

标签 node.js garbage-collection v8

根据 google 的说法,V8 通过采用“stop-the-world,generational,accurate,garbage collector”来使用高效的垃圾收集。部分声明是 V8 在执行垃圾回收周期时停止程序执行。

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

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

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

谢谢

最佳答案

“高效”有多种含义。这里可能指的是高吞吐量。在查看响应时间时,您对延迟更感兴趣,这确实比使用其他 GC 策略更糟糕。

stop-the-world GC 的主要替代方案是

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

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

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

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

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

关于node.js - Node.js 中的垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15334106/

相关文章:

javascript - puppeteer-cluster:队列而不是执行

javascript - 如何销毁 THREEJS Scene?

java - System.gc() 什么时候做某事?

google-apps-script - 从 Rhino 切换到 V8 导致错误代码 PERMISSION_DENIED

c++ - 使用 Global with Value 时的 V8 段错误

node.js - 缓存 promise 导致 Node.js 中未处理的 promise 拒绝

node.js - 带有长字符串错误的 Sequelize/繁琐的创建/更新记录 : read ECONNRESET

javascript - 如何点击 webdriverIO 中的链接

wcf - 使用 WCF (.NET) 进行进程内通信设计

node.js - 常驻内存大于 --max-old-space-size 阈值?