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

 mobiledu2502875393 发布于 2022-12-19 12: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这就是我创建单独问题的原因.

7 个回答
  • 我发现这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 
    

    2022-12-19 12:31 回答
  • 只是对上述答案的一种变化.

    我尝试了上面的直接节点命令但没有成功,但是这个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'脚本'部分,如下所示:

    "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(sudo npm run prod如果你在Mac或Linux上,你可能需要运行).

    请注意,可能存在导致Node需要更多内存的潜在问题 - 如果是这种情况,则无法解决此问题 - 但它至少为Node提供了执行构建所需的内存.

    2022-12-19 12:31 回答
  • 注意:请参阅注释中的警告,了解这将如何影响Electron应用程序.

    自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

    2022-12-19 12:32 回答
  • increase-memory-limit模块现已弃用.自2017年8月发布的Nodejs v8.0起,我们现在可以使用NODE_OPTIONSenv变量来设置max_old_space_size全局.

    increase-memory-limit

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

    2022-12-19 12:32 回答
  • 如果您查看源:github/v8,它会尝试保留一个非常大的对象吗?我的经验是,如果你试图解析一个巨大的JSON对象会发生这种情况,但是当我尝试使用JSON和node0.11.13解析你的输出时,它运行正常.

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

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

    2022-12-19 12:32 回答
  • $ sudo npm i -g increase-memory-limit
    

    从项目的根位置运行:

    $ increase-memory-limit
    

    此工具将在node_modules/.bin/*文件中的所有节点调用中附加--max-old-space-size = 4096.


    Node.js version> = 8 - DEPRECATION NOTICE

    自NodeJs V8.0.0起,就可以使用该选项--max-old-space-size.NODE_OPTIONS =选项...

    $ export NODE_OPTIONS=--max_old_space_size=4096
    

    2022-12-19 12:32 回答
  • 要解决此问题,您需要通过使用该选项增加内存限制来运行应用程序--max_old_space_size.默认情况下,Node.js的内存限制为512 MB.

    node --max_old_space_size=2000  server.js 
    

    2022-12-19 12:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有