无法识别V8中年轻代空间的限制

问题描述 投票:0回答:1

我正在研究 NodeJS 中的 --max-semi-space-size 并浏览了网上的文章。然而,我从一个 6 岁的 blog 来自 v8

找到了以下文字

由于年轻代相对较小(V8 中最大为 16MiB),因此它很快就会充满对象并需要频繁收集。直到 M62,V8 使用切尼半空间复制垃圾收集器(见下文)将年轻代分为两半。

现在,根据 NodeJS 文档:

设置V8的清理垃圾收集器的最大半空间大小 以 MiB(兆字节)为单位。增加半空间的最大尺寸可能会 以更多内存消耗为代价提高 Node.js 的吞吐量

现在,如果我们确定 V8 的 Young Generation 最多可以容纳 16 MB,但是,我们知道 Young Generation 是 3 x Semi-Space Size 集[来源],因此这两种说法是矛盾的。我感觉关于 16MB 限制的第一个声明在当前情况下是旧的且不正确的,但找不到任何内容。有什么帮助吗?

node.js garbage-collection v8
1个回答
0
投票

(这里是 V8 开发者。)

我不确定你在哪里看到了矛盾。

V8 在一定限制内动态调整年轻代的大小,以对应用程序的行为(特别是:分配率和提升率)做出反应。有一个默认的最大值,以及一个可以覆盖它的命令行标志。

您几乎可以将年轻代的最大大小设置为您想要的任何值。但这通常不是一个好主意:默认值的选择非常仔细,并且提供了通常相当不错的总体权衡。在极少数情况下,特定应用程序碰巧具有如此特定的分配模式,以至于它对默认规则感到不走运,并从某些自定义中受益。

年轻一代被实现为two半空间;其中一个总是空的,因此可以公平地互换使用术语“年轻一代大小”和“半空间大小”。术语的正确选择/解释取决于您感兴趣的角度:用于年轻代的操作系统预留的内存大小等于两个半空间的总大小;年轻代中所有对象的最大大小等于一个半空间的大小。

因此,为了记录和未来的读者:

我们知道年轻代是 3 x 半空间大小

不,有两个半空间。 (从名字上看:“semi”就是“一半”的意思。)
年轻一代中的所有对象都在这些半空间之一中。

当保守堆栈扫描迫使我们转向非移动的年轻一代收集器时,所有这些很有可能很快就会过时™。当这种情况发生时,可能会有一篇博客文章:-)

增加半空间的最大大小可能会提高 Node.js 的吞吐量,但代价是消耗更多内存

嗯,这句话中的关键词是“may”。增加最大半空间大小也可能会损害吞吐量;年轻一代相对较少是有充分理由的。不要只是提高限制,除非您已经测量到这实际上对您关心的工作负载有益(因为很可能不是)。

© www.soinside.com 2019 - 2024. All rights reserved.