致命错误:CALL_AND_RETRY_LAST分配失败 – 进程内存不足

节点版本是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 ) }) 

要检查recursion堆栈大小问题,我是否已经使用–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分配失败 – 处理内存不足,具有相同的 – 堆栈大小= 60000参数,并没有Segmentation fault

所以我得出结论CALL_AND_RETRY_LAST和recursion堆栈的大小没有任何共同之处。

我怎么能解决这个问题? 我相信我的计算机上有足够的可用内存来成功完成此任务。

在stackoverflow上也有类似的问题,但这些问题都不是关于CALL_AND_RETRY_LAST ,这就是为什么我创build了单独的问题。

如果你看一下源代码: github / v8 ,它会接近你试图保留一个非常大的对象吗? 我的经验是,如果你尝试parsing一个巨大的JSON对象,但是当我尝试用JSON和node0.11.13parsing输出时,会发生这种情况。

你不需要更多 – --stack-size ,你需要更多的内存: – --max_new_space_size和/或 – --max_old_space_size

唯一的提示,我可以给你旁边:尝试另一个JSONparsing器和/或尝试将input格式更改为JSON行而不是JSON。

我发现max_new_space_size不是节点4.1.1中的一个选项, max_old_space_size本身并没有解决我的问题。 我将以下内容添加到我的剪贴簿中,并且这些组合似乎起作用:

 #!/usr/bin/env node --max_old_space_size=4096 --optimize_for_size --max_executable_size=4096 --stack_size=4096 

[UPDATE]:在运行grunt时也发现了这个错误,它以前是这样运行的:

 ./node_modules/.bin/grunt 

将命令更新为以下之后,停止了内存错误:

 node --max_old_space_size=2048 ./node_modules/.bin/grunt 

要解决此问题,需要通过使用选项--max_old_space_size来增加内存限制来运行应用程序。 默认情况下,Node.js的内存限制是512 MB。

 node --max_old_space_size=2000 server.js 

只是上面的答案变化。

我尝试了上面的直接上面的命令没有成功,但从这个Angular CLI问题的build议为我工作 – 你在package.json文件中创build一个节点脚本,以增加当您运行生产构build时可用于节点的内存。

所以,如果你想增加节点的可用内存到4GB( max-old-space-size=4096 ),你的Node命令将是node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod 。 (根据你的需要增加或减less内存的数量 – 4GB为我工作,但你可能需要更多或更less)。 然后你将它添加到你的package.json的“脚本”部分,如下所示:

"prod": "node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod"

它将被包含在脚本对象中,以及可用的其他脚本 – 例如:

 "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", "prod": "node --max-old-space-size=4096./node_modules/@angular/cli/bin/ng build --prod" } 

你可以通过调用npm run prod运行它(如果你在Mac或者Linux上,你可能需要运行sudo npm run prod )。

请注意,可能存在导致Node需要更多内存的潜在问题 – 这不会解决如果是这种情况 – 但它至less为Node提供执行构build所需的内存。

 sudo npm install -g increase-memory-limit 

从项目的根目录运行:

 increase-memory-limit 

此工具将在node_modules / .bin / *文件内的所有节点调用中追加–max-old-space-size = 4096。

我失去了一些日子,这个问题….直到我发现在一些文件,我正在导入一个静态文件,一个build立的文件。 它使构build永不结束。 就像是:

 import PropTypes from "../static/build/prop-types"; 

解决真正的来源解决了所有的问题。

分享我的解决scheme 🙂