节点内存使用率和内存不足

时间:2019-06-07 11:49:49

标签: javascript node.js v8

这里有些混乱。我的节点服务崩溃了。但是,使用的堆远低于堆总数吗?

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

1 个答案:

答案 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)。

What's the maximum size of a Node.js Buffer