这里有些混乱。我的节点服务崩溃了。但是,使用的堆远低于堆总数吗?
{"rss":8120283136,"heapTotal":7640494080,"heapUsed":4244076904,"external":33576},"msg":"STATS","v":1}
<--- Last few GCs --->
[1:0x2a1edc0] 30954759 ms: Mark-sweep 4017.1 (7221.0) -> 4017.1 (7152.0) MB, 2222.4 / 0.0 ms (average mu = 0.889, current mu = 0.000) last resort GC in old space requested
运行--max-old-space-size=7168
在我看来,应该至少有3 GB的可用堆?
答案 0 :(得分:2)
在V8
中,内置对象有很多硬编码的大小限制,您可以达到其中之一。这是几个示例:
FWIW,一切都有限制:除了最大堆大小之外, 有最大字符串长度,最大数组长度,最大 ArrayBuffer长度,最大BigInt大小,最大堆栈大小等。 这些限制中的任何一项都有可能引起争议,有时甚至是 提高它们很有意义,但是这样的局限性仍然存在。关 我不知道要怎么撞到这个特殊的东西 限制为例如两倍-而且我也不知道 两倍就足以满足您的期望。
V8开发人员jmrk
2017年夏季,V8将字符串的最大大小从〜256MB增加到 到〜1GB。具体来说,从64位的2 ^ 28-16到2 ^ 30-25 平台。
V8/Node.js increase max allowed String length
极限由下式确定:
地图的FixedArray后备存储区的最大大小为1GB (与总堆大小限制无关)在64位系统上 表示1GB / 8B = 2 ^ 30/2 ^ 3 = 2 ^ 27〜= 134M最大元素 FixedArray一个Map每个条目需要3个元素(键,值,下一个存储桶) 链接),并且最大负载因子为50%(避免速度变慢) 由许多铲斗碰撞引起),其容量必须是 2. 2 ^ 27 /(3 * 2)向下舍入为2的下一个幂是2 ^ 24,这是您观察到的极限。
Maximum number of entries in Node.js Map?
但是,根据ECMA-262第5条,阵列的最大长度 由于以下原因,版本规范受一个无符号的32位整数约束 ToUint32抽象操作,因此可能的最长数组 有232-1 = 4,294,967,295 = 42.9亿个元素。
Maximum size of an Array in Javascript
V8中类型化数组的最大长度当前设置为kSmiMaxValue 取决于平台是:
1Gb-32位1字节2Gb-64位1字节 代码是v8 :: internal :: JSTypedArray :: kMaxLength(源)。
V8团队正在努力在64位上进一步提高 平台,当前ArrayBuffer对象最多可以 Number.MAX_SAFE_INTEGER大(2 ** 53-1)。