【问题标题】:FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory致命错误:CALL_AND_RETRY_LAST 分配失败 - 进程内存不足
【发布时间】:2014-11-23 12:32:30
【问题描述】:

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

【问题讨论】:

  • 您的代码在 Node.js 0.10.28 上运行良好。它占用了 1200 MB 的虚拟内存,并在屏幕上打印出数量惊人的垃圾,但它似乎“工作”了。
  • 垃圾正是我想要得到的。不好的是节点 0.10.* 不支持和声发生器,因此我不能将它用于此目的。

标签: node.js


【解决方案1】:

您还应该检查是否不小心安装了 x86 版本的 node 而不是 x64。发生在我身上,因为 nodejs.org 在我的 x64 机器上预选了 x86...

【讨论】:

  • 我也犯了同样的错误!谢谢。
  • 被低估的评论。这解决了我的问题。
【解决方案2】:

我换了

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

【讨论】:

    【解决方案3】:

    #!/usr/bin/env node --max-old-space-size=4096 在 ionic-app-scripts.js 工作中

    但修改后:以下文件有效

    node_modules/.bin/ionic-app-scripts.cmd

    通过添加:

    @IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0..@ionic\app-scripts\bin\ionic-app-scripts.js" %* ) 别的 ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% 节点 --max_old_space_size=4096 "%~dp0..@ionic\app-scripts\bin\ionic-app-scripts.js" %* )

    【讨论】:

      【解决方案4】:

      在 Windows 机器中运行以下命令

      设置 NODE_OPTIONS=--max_old_space_size=4096

      【讨论】:

        【解决方案5】:

        任何人在使用 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
        

        【讨论】:

        • 这个作为评论会更好(因为它不回答OP),但它仍然是一个非常有用的提示!
        【解决方案6】:
        $ sudo npm i -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
        

        【讨论】:

        • 你好,@sol-ibit。 4096 参数是什么意思?
        • 嗨@estebanpdl,使用增加内存运行Node.js 应用程序的解决方案是使用额外的V8 标志启动进程:--max-old-space-size。您需要以 MB 为单位附加所需的内存大小。以下命令将以 4 GB 的内存限制启动您的应用程序。
        • export NODE_OPTIONS=--max_old_space_size=4096 设置变量对我有用!谢谢!
        【解决方案7】:

        如果您查看源:github/v8,似乎您尝试保留一个非常大的对象。根据我的经验,如果您尝试解析一个巨大的 JSON 对象,则会发生这种情况,但是当我尝试解析时你的输出带有 JSON 和 node0.11.13,它工作正常。

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

        我可以给你的唯一提示是尝试另一个 JSON 解析器和/或尝试将输入格式更改为 JSON 行而不是仅 JSON。

        【讨论】:

        • 非常感谢!定义 --max_old_space_size=2000000 我相信这意味着〜2GB已经解决了我的问题。改变 --max_new_space_size 似乎根本没有任何效果。
        • 我还查看了 v8 源代码,但根本不明白那里发生了什么。所以我在没有你帮助的情况下解决这个问题的机会可能趋于零。再次感谢您。
        • @theWanderer4865 “尝试将输入格式更改为 JSON 行而不是仅 JSON。”是什么意思?你能详细说明一下吗?谢谢。
        • @user619271 --max_old_space_size=2048 是 2gb
        • 哈哈..@Timeless
        【解决方案8】:

        increase-memory-limit 模块现已弃用。 从 2017 年 8 月发布的 Node.js v8.0 开始,我们现在可以使用 NODE_OPTIONS 环境变量来全局设置 max_old_space_size

        export NODE_OPTIONS=--max_old_space_size=4096
        

        参考网址:https://github.com/endel/increase-memory-limit

        【讨论】:

        • 你在哪里设置这个?我正在使用 Azure DevOps 构建并且构建在 Windows 代理中失败
        • 为了避免跨平台差异,请全局安装cross-env模块并在终端上运行这样的命令-cross-env PORT=8000 node --max-old-space-size=4096 server.js
        • Azure Devops 构建在云上的 MS 代理上运行,没有控制台可以执行它们。我找到了另一种使用powershell实现这些的方法。在这里添加它作为答案。
        【解决方案9】:
        npm install -g increase-memory-limit
        

        增加内存限制

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

        现在 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" %*
        )
        

        【讨论】:

          【解决方案10】:

          我在 ionic 中遇到了这个问题并尝试了很多解决方案,但通过运行它解决了这个问题。

          对于 MAC: node --max-old-space-size=4096 /usr/local/bin/ionic cordova build android --prod

          对于 Windows: node --max-old-space-size=4096 /Users/{your user}/AppData/Roaming/npm/node_modules/ionic/bin/ionic cordova build windows --prod

          【讨论】:

            【解决方案11】:

            当为执行分配的所需内存小于运行进程所需的内存时,会发生此错误。默认情况下,节点内存大小为 512 mb,您需要键入以下命令:

            node --max-old-space-size= <NewSize> <fileName>
            

            【讨论】:

            • 这里的文件名是什么?
            【解决方案12】:

            我发现 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 
            

            【讨论】:

            • 我添加了 --max_old_space_size=8192 ,它仍然没有解决问题但确实挂了我的电脑:(
            • 我将示例中的内存量从 8Gb 降低到 4Gb,感谢您的反馈。
            【解决方案13】:

            我的工作解决方案是:

            • 安装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

            • 问题已解决。

            【讨论】:

              【解决方案14】:

              注意:请参阅 cmets 中有关这如何影响 Electron 应用程序的警告。

              从 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

              【讨论】:

              • 警告词:不要将它设置为 Windows 机器上的环境变量。它破坏了一切。它破坏了 GitKraken、Slack、VS2017 安装程序(基于 chromium)、与 Azure 相关的 VS2017 扩展,甚至 VS2017 中的“扩展和更新”菜单项。
              • 看看github.com/electron/electron/issues/12695 - 看起来 Electron 在 2.0.3 中不会从 NODE_OPTIONS 崩溃 - 但我仅在特定项目目录中使用 smartcd 设置 NODE_OPTIONS 以避免此问题github.com/cxreg/smartcd跨度>
              • 啊,这可能解释了为什么 Discord 和 VS Code 不受影响。
              • 如何在 Windows 机器上做到这一点?
              【解决方案15】:

              我在为 react-native 创建捆绑包时看到了这个问题。 我尝试过但没有成功的方法:

              1. 增加 node --max_old_space_size,有趣的是,这对我来说在本地有效,但在 jenkins 上失败了,我仍然不确定 jenkins 出了什么问题
              2. 提到的一些地方将节点的版本降级到 6.9.1,这对我也不起作用。我只是想把它放在这里,因为它可能对你有用。

              对我有用的事情: 我在代码中导入了一个非常大的文件。我解决它的方法是将它包含在.babelrcignore 列表中,如下所示:

              {
                  "presets": ["react-native"],
                  "plugins": ["transform-inline-environment-variables"],
                  "ignore": ["*.json","filepathToIgnore.ext"]
              }
              

              这是一个 .js 文件,并不需要转译并将其添加到忽略列表中确实有帮助。

              【讨论】:

                【解决方案16】:

                另一种解决方案是禁用 AOT 编译器:

                ng build --prod --aot false
                

                【讨论】:

                • 你能详细说明为什么是假的吗?
                【解决方案17】:

                只是上述答案的变体。

                我尝试了上面的直接向上 node 命令但没有成功,但来自 this Angular CLI issue 的建议对我有用 - 您在 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 'scripts' 部分,如下所示:

                "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 提供了执行构建所需的内存。

                【讨论】:

                  【解决方案18】:

                  我因这个问题失去了几天......直到我发现在某个文件中我正在导入一个静态文件,一个构建文件。它使构建永无止境。比如:

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

                  修复真实来源解决了所有问题。

                  分享我的解决方案。 :)

                  【讨论】:

                  • 您能再解释一下您的解决方案吗?我遇到了同样的问题,它使我的应用程序崩溃。应用程序运行的前几分钟一切正常,但最终因内存不足而崩溃。但在此期间,Sequelize 运行良好。
                  • 发生了什么,是我的 IDE (WebStorm) 自动在我的源代码中包含了 BUILDED js……当一个文件(在我的源代码上)被更改时,它会将所有文件构建到一个新的 js 输出中。但是,如果我的资源引用了已构建的文件,它就永远不会停止构建。检查哪些文件包含不正确的文件。
                  【解决方案19】:

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

                  node --max_old_space_size=2000  server.js 
                  

                  【讨论】:

                  • 请问有分步指南吗?我在哪里粘贴这个忠实的代码:node --max_old_space_size=2000 server.js
                  • @Mr.Benedict 您在启动应用程序时执行此操作。
                  • node --max_old_space_size=2048 server.js ...更合适...谢谢
                  • 我在谷歌云上有一个 React 应用程序。我怎样才能做到这一点?谁能指导一下?
                  • @easymoden00b 不是node server.js,而是npm start。我该怎么做?
                  猜你喜欢
                  • 2019-06-28
                  • 2016-12-19
                  • 1970-01-01
                  • 2018-11-10
                  • 2018-09-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-12-17
                  相关资源
                  最近更新 更多