Node.js堆内存限制为单个对象

v8是否对单个对象的堆分配有限制?

a = new Array(1024*1024*102)

在节点命令行上失败

FATAL ERROR: JS Allocation failed - process out of memory

而且,当以脚本运行时,这会失败并出现相同的错误

node --expose-gc --nouse-idle-notification --max-old-space-size=8192

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

 var util = require('util'); o = {}; while(1) { o["hahahahahaha" + String(ctr)] = ctr; ctr++; if (ctr % 100000 === 0) { console.log(util.inspect(process.memoryUsage())); if (ctr % 10000000 === 0) gc(); } } 

最后输出:

{ rss: 1009557504, heapTotal: 993408824, heapUsed: 964980592 }

然而,

 var a = []; while(1) { var o = {}; o["hahahahahaha" + String(ctr)] = ctr; a.push(o); ctr++; if (ctr % 100000 === 0) { console.log(ctr); console.log(util.inspect(process.memoryUsage())); console.log(); if (ctr % 10000000 === 0) gc(); } } 

很好

{ rss: 5466140672, heapTotal: 1091224368, heapUsed: 1070460592 }

编辑:

node -v

v0.10.25

uname -a

Linux 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

编辑2:即使这个工程! 看来,V8的限制适用于对象可以具有的属性数量?

 while(1) { if (!o["hahahahahaha" + String(Math.floor(ctr/1000000))]) { o["hahahahahaha" + String(Math.floor(ctr/1000000))] = {}; console.log(Object.keys(o)) } o["hahahahahaha" + String(Math.floor(ctr/1000000))][String(ctr)] = ctr; ctr++; if (ctr % 100000 === 0) { console.log(ctr); console.log(util.inspect(process.memoryUsage())); console.log(); if (ctr % 10000000 === 0) gc(); } } 

{ rss: 2474512384, heapTotal: 2466405768, heapUsed: 2431583008 }

另外,我发现这个: https : //github.com/v8/v8/blob/master/src/objects.h#L2928

我想知道这是否相关。

事实certificate,对string,对象和数组的最大大小有严格的限制。 限制是旧的垃圾收集器的残余。 这是相关的票:

https://code.google.com/p/v8/issues/detail?id=3505