节点版本为v0.11.13
根据sudo top
在崩溃期间内存使用率不会超过3%
再现此错误的代码:
var request = require('request')
var nodedump = require('nodedump')
request.get("http://pubapi.cryptsy.com/api.php?method=marketdatav2",function(err,res)
{
var data
console.log( "Data received." );
data = JSON.parse(res.body)
console.log( "Data parsed." );
data = nodedump.dump(data)
console.log( "Data dumped." );
console.log( data )
})
为了检查是否存在递归堆栈大小问题,我使用-stack-size=60000参数运行了下一段代码
var depth = 0;
(function recurse() {
// log at every 500 calls
(++depth % 500) || console.log(depth);
recurse();
})();
并且得到了
264500
Segmentation fault
然后我运行的代码给出了一个致命的错误:CALL_AND_RETRY_LAST Allocation失败-进程内存不足,具有相同的-stack-size=60000参数,并且没有segmentation fault
。
因此我得出结论call_and_retry_last
与递归堆栈大小没有共同之处。
我该怎么解决这个问题呢?我相信我的计算机上有足够的空闲内存来成功地完成这项任务。
关于stackoverflow也有类似的问题,但这些问题都不是关于call_and_retry_last
的,这就是我创建单独问题的原因。
根据我的经验,如果您试图解析一个巨大的JSON对象,就会发生这种情况,但当我试图用JSON和Node0.11.13解析您的输出时,它就能正常工作。
您不需要更多的--stack-size
,而是需要更多的内存:--max_new_space_size
和/或--max_old_space_size
。
除此之外,我能给您的唯一提示是尝试另一个JSON-parser和/或尝试将输入格式更改为JSON行,而不是仅JSON。
$ sudo npm i -g increase-memory-limit
从项目的根位置运行:
$ increase-memory-limit
该工具将在node_modules/.bin/*文件中的所有节点调用中追加-max-old-space-size=4096。
node.js版本>=8-弃用通知
从NodeJSV8.0.0开始,就可以使用--max-old-space-size
选项。NODE_OPTIONS=选项...
$ export NODE_OPTIONS=--max_old_space_size=4096
要解决这个问题,您需要通过使用--max_old_space_size
选项来增加内存限制来运行应用程序。默认情况下,Node.js的内存限制为512 MB。
node --max_old_space_size=2000 server.js