节点版本为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
无关,这就是我创建单独问题的原因。
答案 0 :(得分:98)
如果您查看来源:github/v8,您似乎尝试保留一个非常大的对象?我的经验是,如果您尝试解析一个巨大的JSON对象,会发生这种情况,但是当我尝试使用JSON和node0.11.13解析您的输出时,它就可以正常工作。
您不需要更多--stack-size
,需要更多记忆:--max_new_space_size
和/或--max_old_space_size
。
我可以给你的唯一提示:尝试另一个JSON解析器和/或尝试将输入格式更改为JSON行而不是JSON行。
答案 1 :(得分:41)
要解决此问题,您需要使用选项--max_old_space_size
增加内存限制来运行应用程序。默认情况下,Node.js的内存限制为512 MB。
node --max_old_space_size=2000 server.js
答案 2 :(得分:33)
$ sudo npm install -g increase-memory-limit
从项目的根位置运行:
$ increase-memory-limit
此工具将在node_modules / .bin / *文件中的所有节点调用中附加--max-old-space-size = 4096。
Node.js版本> = 8 - 弃用通知
自NodeJs V8.0.0起,可以使用选项--max-old-space-size
。 NODE_OPTIONS=options...
$ export NODE_OPTIONS=--max_old_space_size=4096
答案 3 :(得分:29)
我发现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
答案 4 :(得分:17)
注意:请参阅评论中有关如何影响电子应用的警告。
自2017年8月发布的v8.0起,NODE_OPTIONS环境变量公开此配置(请参阅NODE_OPTIONS has landed in 8.x!)。根据文章,只允许选项whitelisted in the source(注意:不是最新链接!),其中包括"--max_old_space_size"
。请注意,这篇文章的标题似乎有点误导 - 似乎NODE_OPTIONS已经存在,但我不确定它是否暴露了此选项。
所以我放入.bashrc
:
export NODE_OPTIONS=--max_old_space_size=4096
答案 5 :(得分:12)
increase-memory-limit
模块现已被弃用。
从2017年8月发布的 Node.js v8.0 开始,我们现在可以使用NODE_OPTIONS
env变量来全局设置max_old_space_size
。
export NODE_OPTIONS=--max_old_space_size=4096
答案 6 :(得分:11)
只是对上述答案的一种变化。
我尝试了上面的直接节点命令但没有成功,但this Angular CLI issue的建议对我有用 - 你在package.json
文件中创建一个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": {
"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需要更多内存的潜在问题 - 如果是这样的话,这并不能解决这个问题 - 但它至少会为Node提供执行构建所需的内存
答案 7 :(得分:5)
您还应该检查是否不小心安装了 x86 版本的 node 而不是 x64。发生在我身上,因为 nodejs.org 在我的 x64 机器上预选了 x86...
答案 8 :(得分:2)
我的解决方案是:
npm install --save-dev cross-env
或npm install -g cross-env
。package.json
添加新的构建脚本...
"build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release"
...
使用该命令进行下一次构建。
npm run build:prod:ios
问题已解决。
答案 9 :(得分:1)
另一种解决方案是禁用AOT编译器:
ng build --prod --aot false
答案 10 :(得分:1)
当我创建一个反应原生的包时,我看到了这个问题。 我尝试过但没有用的东西:
node --max_old_space_size
,这对我来说很有意义,但在jenkins上失败了,我仍然不确定jenkins出了什么问题对我有用的事情:
我在代码中导入了一个非常大的文件。我解决它的方法是将其包含在ignore
.babelrc
列表中,如下所示:
{
"presets": ["react-native"],
"plugins": ["transform-inline-environment-variables"],
"ignore": ["*.json","filepathToIgnore.ext"]
}
这是一个.js
文件,它实际上并不需要进行转换,并将其添加到忽略列表中确实有帮助。
答案 11 :(得分:1)
我在这个问题上丢失了几天....直到我发现在某个文件中我导入了一个静态文件,一个内置文件。它使构建永无止境。类似的东西:
import PropTypes from "../static/build/prop-types";
修复真正的源码解决了所有问题。
分享我的解决方案。 :)
答案 12 :(得分:1)
我在离子方面正面临着这个问题,并尝试了许多解决方案,但是通过运行此解决方案。
对于MAC: 节点--max-old-space-size = 4096 / usr / local / bin / ionic cordova构建android --prod
对于Windows: 节点--max-old-space-size = 4096 / Users / {您的用户} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova构建Windows --prod
答案 13 :(得分:1)
当分配给执行的所需内存小于正在运行的进程所需的内存时,会发生此错误。默认情况下,节点内存大小为512 mb,要增加此大小,您需要输入以下命令:
node --max-old-space-size= <NewSize> <fileName>
答案 14 :(得分:1)
npm install -g increase-memory-limit
增加内存限制
OR
C:\Users\{user_name}\AppData\Roaming\npm
--max_old_space_size=8192
和IF
块中添加ELSE
现在 ng.cmd 文件如下所示:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)
答案 15 :(得分:1)
在Windows计算机上,运行以下命令
设置NODE_OPTIONS =-max_old_space_size = 4096
答案 16 :(得分:0)
任何人在Azure构建管道中遇到此错误,请尝试以下步骤更改构建代理的环境变量
在使用以下设置进行编译之前,先添加Azure build pipeline task
-> Azure powershell script:Inlinescript
- task: AzurePowerShell@3
displayName: 'Azure PowerShell script: InlineScript'
inputs:
azureSubscription: 'NYCSCA Azure Dev/Test (ea91a274-55c6-461c-a11d-758ef02c2698)'
ScriptType: InlineScript
Inline: '[Environment]::SetEnvironmentVariable("NODE_OPTIONS", "--max_old_space_size=16384", "Machine")'
FailOnStandardError: true
azurePowerShellVersion: LatestVersion
答案 17 :(得分:0)
#!/ ionic / app-scripts.js dint工作中的/ usr / bin / env节点--max-old-space-size = 4096
但是在修改之后:以下文件起作用了
node_modules / .bin / ionic-app-scripts.cmd
通过添加:
@IF EXIST“%〜dp0 \ node.exe”( “%〜dp0 \ node.exe”“%〜dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js”%* )ELSE( @SETLOCAL @SET PATHEXT =%PATHEXT:;。JS; =;% 节点--max_old_space_size = 4096“%〜dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js”%* )
答案 18 :(得分:0)
我换了
ng build --prod
与
node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --prod
因此,不要使用 ng build --prod
,而是使用以 node..
开头的上述命令。要生成生产构建,不需要使用 ng server --prod
。
如果您不想使用 --prod
,只需将其删除即可。
所以这些是在 vs code 终端中使用的命令
node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --prod
node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve