致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足

时间:2014-09-29 07:17:05

标签: node.js

节点版本为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无关,这就是我创建单独问题的原因。

19 个答案:

答案 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-sizeNODE_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

引用URL:https://github.com/endel/increase-memory-limit

答案 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)

我的解决方案是:

  • 安装cross-env
    npm install --save-dev cross-envnpm 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)

当我创建一个反应原生的包时,我看到了这个问题。 我尝试过但没有用的东西:

  1. 增加node --max_old_space_size,这对我来说很有意义,但在jenkins上失败了,我仍然不确定jenkins出了什么问题
  2. 有些地方提到要将节点版本降级到6.9.1,这对我来说也不起作用。我想把它放在这里,因为它可能适合你。
  3. 对我有用的事情: 我在代码中导入了一个非常大的文件。我解决它的方法是将其包含在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

  1. 导航到%appdata%-> npm文件夹或C:\Users\{user_name}\AppData\Roaming\npm
  2. 在您喜欢的编辑器中打开ng.cmd
  3. --max_old_space_size=8192IF块中添加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