节点版本是 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分配失败 - 使用相同的--stack-size = 60000参数处理内存不足但没有得到Segmentation fault
.
所以我总结CALL_AND_RETRY_LAST
一下,递归堆栈大小并不常见.
我怎么能解决这个问题?我相信我的计算机上有足够的可用内存来成功完成此任务.
stackoverflow上有类似的问题,但这些问题都没有关于CALL_AND_RETRY_LAST
这就是我创建单独问题的原因.
我发现这max_new_space_size
不是节点4.1.1中的一个选项,max_old_space_size
单独没有解决我的问题.我将以下内容添加到我的shebang中,这些组合似乎有效:
#!/usr/bin/env node --max_old_space_size=4096 --optimize_for_size --max_executable_size=4096 --stack_size=4096
[编辑]:4096 === 4GB的内存,如果你的设备内存不足,你可能想选择较小的数量.
[更新]:在运行以前运行的grunt时也发现了这个错误:
./node_modules/.bin/grunt
将命令更新到以下后,它停止了内存错误:
node --max_old_space_size=2048 ./node_modules/.bin/grunt
只是对上述答案的一种变化.
我尝试了上面的直接节点命令但没有成功,但是这个Angular CLI问题的建议对我有用 - 你在package.json
文件中创建一个Node脚本,以增加运行生成版本时Node可用的内存.
因此,如果您想将Node可用的内存增加到4gb(max-old-space-size=4096
),那么Node命令就是node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod
.(根据你的需要增加或减少内存量--4gb对我有用,但你可能需要更多或更少).然后,您可以将它添加到package.json'脚本'部分,如下所示:
"prod": "node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod"
它将包含在scripts对象中以及其他可用脚本中 - 例如:
"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
(sudo npm run prod
如果你在Mac或Linux上,你可能需要运行).
请注意,可能存在导致Node需要更多内存的潜在问题 - 如果是这种情况,则无法解决此问题 - 但它至少为Node提供了执行构建所需的内存.
注意:请参阅注释中的警告,了解这将如何影响Electron应用程序.
自2017年8月发布的v8.0起,NODE_OPTIONS环境变量公开此配置(请参阅NODE_OPTIONS已落在8.x!中).根据文章,只允许在源中列入白名单的选项(注意:不是最新的链接!),其中包括"--max_old_space_size"
.请注意,这篇文章的标题似乎有点误导 - 似乎NODE_OPTIONS已经存在,但我不确定它是否暴露了这个选项.
所以我把我的.bashrc
:
export NODE_OPTIONS=--max_old_space_size=4096
该increase-memory-limit
模块现已弃用.自2017年8月发布的Nodejs v8.0起,我们现在可以使用NODE_OPTIONS
env变量来设置max_old_space_size
全局.
increase-memory-limit
参考URL:https://github.com/endel/increase-memory-limit
如果您查看源:github/v8,它会尝试保留一个非常大的对象吗?我的经验是,如果你试图解析一个巨大的JSON对象会发生这种情况,但是当我尝试使用JSON和node0.11.13解析你的输出时,它运行正常.
你不需要更多--stack-size
,你需要更多的内存:--max_new_space_size
和/或--max_old_space_size
.
我可以给你的唯一提示:尝试另一个JSON解析器和/或尝试将输入格式更改为JSON行而不是JSON行.
$ sudo npm i -g increase-memory-limit
从项目的根位置运行:
$ increase-memory-limit
此工具将在node_modules/.bin/*文件中的所有节点调用中附加--max-old-space-size = 4096.
Node.js version> = 8 - DEPRECATION NOTICE
自NodeJs V8.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