我今天遇到了一个奇怪的问题。对于其他人来说,这可能是一个简单的答案,但它让我难过。为什么下面的代码会导致内存错误?
var cur = 167772160;
var bcast = 184549375;
var addresses = [];
while (cur <= bcast){
cur += 1;
addresses.push(cur);
}
addresses.length
addresses // memory goes from a few megs to over a gig in seconds when trying to print this
我得到了这两个错误中的一个......第一个是我在node的解释器中运行这个代码而后者是我通过nodeunit运行它时:
致命错误:CALL_AND_RETRY_2分配失败 - 处理内存不足
致命错误:JS分配失败 - 处理内存不足
答案 0 :(得分:23)
您可以通过传递以MB为单位的--max-old-space-size=<value>
来增加默认限制。
该示例将允许节点堆使用最多4GB(4096 兆字节)的内存:
node --max-old-space-size=4096 app
答案 1 :(得分:7)
当我尝试访问阵列时会发生这种情况。 但是获得长度却没有。
> var cur = 167772160;
> var bcast = 184549375;
> var addresses = [];
> while (cur <= bcast){
... cur += 1;
... addresses.push(cur);
... }
16777216
> addresses.length
16777216
> addresses
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
这是另一个SO问题,memory limit in Node.js (and chrome V8)与内存使用问题有关。
答案 2 :(得分:4)
运行脚本时,我没有收到内存分配错误。你的系统有多少RAM?
修改的 好了作者的更新说明,我可以复制它。
Node尝试将整个数组转换为字符串。该数组长16777216个元素。每个元素包含至少9位数的数字。将其转换为长度为150,994,994个字符的字符串。它只是一个超出节点内存容量的巨大操作。