节点版本号为v0.11.13

内存使用在崩溃期间根据sudo顶部不超过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参数,并且没有分割错误。

因此,我得出结论,CALL_AND_RETRY_LAST与递归堆栈大小没有任何共同之处。

我怎么解决这个问题呢?我相信我的电脑上有足够的空闲内存来成功完成这项任务。

在stackoverflow上也有类似的问题,但这些问题都不是关于CALL_AND_RETRY_LAST的,这就是为什么我创建了单独的问题。


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

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

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


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

node --max_old_space_size=2000  server.js 

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

我在这个问题上浪费了一些日子....直到我发现我在某个文件中导入了一个静态文件,一个构建文件。它使构建永远不会结束。喜欢的东西:

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

固定到真正的来源解决了所有的问题。

分享我的解决方案。:)


$ 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-size。NODE_OPTIONS =选项…

$ export NODE_OPTIONS=--max_old_space_size=4096

只是上述答案的一个变体。

我尝试了上面的直接node命令,但没有成功,但这个Angular CLI问题的建议对我有用——你在你的包中创建一个node脚本。json文件来增加运行生产版本时Node可用的内存。

因此,如果你想将Node的可用内存增加到4gb (max-old-space-size=4096),你的Node命令将是Node——max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build——prod。(增加或减少内存数量取决于你的需要- 4gb适合我,但你可能需要更多或更少)。然后将其添加到包中。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来运行它(如果你在Mac或Linux上,你可能需要运行sudo npm run prod)。

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


注意:请参阅评论中的警告,了解这将如何影响Electron应用程序。

在2017年8月发布的v8.0版本中,NODE_OPTIONS环境变量公开了这个配置(参见NODE_OPTIONS已经登陆8.x!)根据这篇文章,只允许源代码中白名单中的选项(注意:不是最新链接!),其中包括“——max_old_space_size”。注意,本文的标题似乎有点误导人——似乎NODE_OPTIONS已经存在,但我不确定它是否公开了这个选项。

所以我输入。bashrc: 出口NODE_OPTIONS =——max_old_space_size = 4096


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

ng build --prod --aot false

当我创建一个react-native包时,我看到了这个问题。 我尝试过但没有成功的事情:

增加节点——max_old_space_size,有趣的是,这在本地为我工作,但在jenkins上失败了,我仍然不确定jenkins出了什么问题 有些地方提到将node的版本降级到6.9.1,但我也没有这样做。我只是想把这个放在这里,因为它可能对你有用。

对我有用的东西: 我在代码中导入了一个很大的文件。我解决这个问题的方法是将它包含在.babelrc的忽略列表中,就像这样:

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

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


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

export NODE_OPTIONS=--max_old_space_size=4096

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


我的工作解决方案是:

安装cross-env NPM install——save-dev cross-env或NPM install -g cross-env 文件包。Json添加新的构建脚本 如。 ... "cross-env NODE_OPTIONS='——max-old-space-size=8192' ionic cordova build ios -prod -release" ... 下次使用该命令进行构建。 NPM运行build:prod:ios 问题解决了。


我在离子中面临这个问题,尝试了许多解决方案,但通过运行这个解决了这个问题。

MAC: Node -max-old-space-size=4096 /usr/local/bin/ionic cordova

Windows: node——max-old-space-size=4096 /Users/{your user}/AppData/Roaming/npm/node_modules/ionic/bin/ionic


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

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

npm install -g increase-memory-limit

increase-memory-limit

OR

导航到%appdata% -> npm文件夹或C:\Users\{user_name}\ appdata \Roaming\npm 打开ng。在您最喜欢的编辑器中的CMD 在IF和ELSE块中添加——max_old_space_size=8192

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

任何使用Azure构建管道遇到此错误的人,请尝试以下步骤更改构建代理的环境变量

添加一个Azure构建管道任务-> Azure powershell脚本:Inlinescript在Compile之前,使用以下设置

- 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

在Windows机器中运行以下命令

设置NODE_OPTIONS =——max_old_space_size = 4096


# !/usr/bin/env节点——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列出= %列出;. js, =; % 节点——max_old_space_size=4096 "%~dp0..@ionic\app-scripts\bin\ionic-app-scripts.js" %* )


我更换了

Ng build -prod

with

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

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