“vanilla”nodeJS (v0.10.28) 中的最大字符串大小在 1GB 左右。
如果您赶时间,可以使用自加倍字符串测试支持的最大字符串大小。测试的系统有 8GB 的 RAM,大部分未使用。
x = 'x';
while (1){
x = ''+x+x; // string context
console.log(x.length);
}
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
FATAL ERROR: JS Allocation failed - process out of memory
Aborted (core dumped)
在另一个测试中,我达到了 1,000,000,000,每次只有一个字符的 for 循环。
现在批评者可能会说,“等等,JSON 怎么样。问题是关于 JSON!”我会大喊在 JAVASCRIPT 中没有 JSON 对象,JS 类型是对象、数组、字符串、数字等......由于 JSON 是字符串表示,这个问题归结为允许的最长字符串是什么。但为了仔细检查,让我们添加一个 JSON.stringify 调用来处理 JSON 转换。
代码
x = 'x';
while (1){
x = ''+x+x; // string context
console.log(JSON.stringify({a:x}).length);
}
期望:JSON 字符串的大小开始大于 2,因为第一个对象将字符串化为 '{"a":"xx"}' 10 个字符。在属性 a 中的 x 字符串变大之前,它不会开始加倍。它可能会在 256M 左右失败,因为它可能会在字符串化中创建第二个副本。回想一下,字符串化是独立于原始对象的。
结果:
10
12
16
24
40
72
136
264
520
1032
2056
4104
8200
16392
32776
65544
131080
262152
524296
1048584
2097160
4194312
8388616
16777224
33554440
67108872
134217736
268435464
和预想的差不多……
现在这些限制可能与nodeJS项目中实现JS的C/C++代码有关,此时我相信它与Chrome浏览器中使用的V8代码相同。
博客文章中有证据表明人们重新编译 nodeJS 以绕过旧版本中的内存限制。还有许多 nodejs 命令行开关。我还没有测试过任何这样的效果。