严重错误:CALL_AND_RETRY_LAST分配失败-进程内存不足


186

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


3
您的代码对Node.js 0.10.28来说对我来说很好。它占用了1200 MB的虚拟内存,并在屏幕上打印了令人难以置信的垃圾,但这似乎“可行”。
John Zwinck

1
垃圾正是我想要得到的。不好的是,节点0.10。*不支持和声生成器,因此我不能将其用于此目的。
user619271

Answers:


112

如果您查看源代码github / v8,似乎您尝试保留一个非常大的对象。根据我的经验,如果您尝试解析一个巨大的JSON对象,则会发生这种情况,但是当我尝试使用JSON和node0.11.13,一切正常。

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

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


10
非常感谢你!定义--max_old_space_size = 2000000,我认为这意味着〜2GB已解决了我的问题。变化--max_new_space_size似乎根本没有任何作用。
user619271 2014年

我也看了看v8源码,但根本不了解正在发生什么。因此,在没有您帮助的情况下解决此问题的机会可能会趋于零。所以再次谢谢你。
user619271

1
@ theWanderer4865“尝试将输入格式更改为JSON行而非仅JSON”是什么意思?您能详细说明一下吗?谢谢。
titusmagnus 2015年

16
@ user619271 --max_old_space_size = 2048是2gb
永恒的

1
哈哈.. @Timeless
technophyle

51
$ 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开始,可以使用option --max-old-space-sizeNODE_OPTIONS =选项...

$ export NODE_OPTIONS=--max_old_space_size=4096

你好,@ sol-ibit。4096参数是什么意思?
estebanpdl

1
@estebanpdl,您好:增加内存运行Node.js应用程序的解决方案是使用附加的V8标志--max-old-space-size启动该过程。您需要追加所需的内存大小(以兆字节为单位)。以下命令将以4 GB的内存限制启动您的应用程序。
sol404

1
设置变量export NODE_OPTIONS=--max_old_space_size=4096对我有用!谢谢!
Tarator

46

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

node --max_old_space_size=2000  server.js 

5
请问有一个逐步的指导如何做到这一点?我在哪里粘贴此忠实的代码: node --max_old_space_size=2000 server.js
本尼迪克特先生(Mr. Benedict)

@ Br.Benedict在启动应用程序时执行此操作。
easymoden00b

2
节点--max_old_space_size = 2048 server.js ...是更合适的...工作谢谢
danday74 '18

1
我在Google云上有一个React应用。我怎样才能做到这一点?有人可以指导吗?
Shubham Kushwah

1
@ easymoden00b不是node server.js,而是npm start。我怎样才能做到这一点?
Shubham Kushwah

30

我发现这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
我添加了--max_old_space_size = 8192,它仍然不能解决问题,但是
却使

感谢您的反馈,我将示例中的内存量从8Gb降低到4Gb。
jfunk

28

注意:请参阅注释中有关此警告可能如何影响电子应用程序的警告。

从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


警告:不要在Windows计算机上将此设置为环境变量。它破坏了一切。它破坏了GitKraken,Slack,VS2017安装程序(基于铬),与Azure相关的VS2017扩展,甚至是VS2017中的“扩展和更新”菜单项。
罗曼·斯塔科夫

看看github.com/electron/electron/issues/12695-看起来Electron不会从2.0.3中的NODE_OPTIONS崩溃-但我仅在特定项目目录中使用smartcd设置了NODE_OPTIONS,以避免出现此问题github.com/cxreg / smartcd
Ben Creasy

嗯,这可能可以解释为什么Discord和VS Code不受影响。
罗曼·斯塔科夫

1
如何在Windows计算机上执行此操作?
马哈茂德·埃扎特

16

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

export NODE_OPTIONS=--max_old_space_size=4096

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


您在哪里设置?我正在使用Azure DevOps构建,并且Windows代理中的构建失败
int-i

为避免跨平台差异,请cross-env全局安装模块并使用以下命令在终端上运行cross-env PORT=8000 node --max-old-space-size=4096 server.js
Ali David

Azure Devops构建在云上的MS代理上运行,没有控制台可以执行它们。我找到了使用Powershell实现这些目标的另一种方法。在此处将其添加为答案。
int-i

13

只是以上答案的一种形式。

我尝试了上面的直接使用node命令,但没有成功,但是来自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'scripts'部分,如下所示:

"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 prodsudo npm run prod如果您使用的是Mac或Linux,则可能需要运行)。

请注意,可能存在一个潜在的问题,该问题导致Node需要更多的内存-不能解决(如果是这种情况)-但它至少为Node提供了执行构建所需的内存。


6

我的工作解决方案是:

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

  • 问题解决了。


1

我花了几天时间解决这个问题...。直到发现某个文件中我要导入一个静态文件,即一个内置文件。它使构建永无止境。就像是:

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

修复真实的源代码可以解决所有问题。

分享我的解决方案。:)


2
您能否再多说明一下您的解决方案?我遇到同样的问题,它使我的应用程序崩溃。在应用程序运行的前几分钟,一切正常,但随后由于内存不足而崩溃。但是在此期间,Sequelize可以正常工作。
Porlune

1
发生的事情是,我的IDE(WebStorm)自动在我的源代码中包含BUILDED js ...当一个文件(在我的源代码中)被更改时,它将所有文件构建到一个新的js输出中。但是,如果我的资源引用了已构建的文件,则它永远不会停止构建。检查哪些文件包含不正确的文件。
TiagoGouvêa17年

1

我在创建本地反应包时遇到了这个问题。我尝试过但不起作用的事情:

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

对我有用的东西:我正在代码中导入一个很大的文件。我解决该问题的方法是将其包含在ignore列表中.babelrc,如下所示:

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

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


1

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

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

1
这里的文件名是什么?
Rashedul.Rubel

1

我曾在离子领域遇到此问题,并尝试了许多解决方案,但通过运行此解决方案。

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

对于Windows: node --max-old-space-size = 4096 / Users / {您的用户} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova构建Windows --prod


1
npm install -g increase-memory-limit

增加内存限制

要么

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

现在,更改后的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" %*
)

1

在Windows Machine中运行以下命令

设置NODE_OPTIONS =-max_old_space_size = 4096



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

0

#!/ usr / bin / env节点-ionic-app-scripts.js中的max-old-space-size = 4096

但修改后:以下文件有效

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

通过添加:

@IF存在“%〜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”%*)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.