致命错误: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 🙂