这里有点混乱。我的节点服务崩溃了。但是,使用的堆比堆总数低得多?

{"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的可用堆?

最佳答案

V8中,内置对象有很多硬编码大小限制,您可以达到其中一个。以下是几个例子:
fwiw,所有东西都有限制:除了最大堆大小,
最大字符串长度,最大数组长度,最大
arraybuffer长度、最大bigint大小、最大堆栈大小等。
这些限制中的任何一个都有潜在的争议,有时
提高它们是有道理的,但这样的限制仍将存在。离开
我不知道该怎么办
限制在,比如说,两个因素——我也不知道
两个因素足以满足你的期望。
V8显影剂jmrk
2017年夏天,V8引擎将字符串的最大大小从约256MB增加到了256MB
到~1gb。具体来说,从2^28-16到2^30-25,64位
平台。
V8/Node.js increase max allowed String length
限值由以下因素决定:
地图的固定阵列备份存储的最大大小为1GB
(不受堆大小限制)在64位系统上
平均1GB/8B=2^30/2^3=2^27~=134m每
一个映射需要3个元素(键、值、下一个bucket
最大负载系数为50%(以避免减速
它的容量必须是
2.2^27/(3*2)四舍五入到2的下一个幂是2^24,这是你观察到的极限。
Maximum number of entries in Node.js Map?
然而,根据ecma-262第5
版本规范由无符号32位整数绑定,原因是
touint32抽象操作,因此尽可能长的数组可以
有232-1=4294967295=42.9亿元素。
Maximum size of an Array in Javascript
V8中类型化数组的最大长度当前设置为ksmimaxvalue
这取决于平台:

代码是v8::internal::jstypedarray::kmaxleng(源代码)。
V8团队正致力于在64位上进一步提高这一性能
平台,当前ArrayBuffer对象可以达到
number.max_safe_整数大(2**53-1)。
What's the maximum size of a Node.js Buffer

关于javascript - Node 内存使用率和内存不足,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56493753/

10-09 07:48
查看更多