Node.js"致命错误:JS分配失败 - 处理内存不足" - 可以获得堆栈跟踪?

时间:2012-11-29 00:18:27

标签: node.js

嗯......我回到了原点。我无法想象我的生活。

我收到以下错误:

FATAL ERROR: JS Allocation failed - process out of memory

我可以列举几十个(是的,几十个)我试图找到这个问题根源的东西,但实际上它太过分了。以下是关键点:

  • 我只能在我的生产服务器上实现它,而且我的应用程序庞大而复杂,因此很难隔离
  • 即使堆大小& RSS大小都是< 200 Mb,鉴于机器(Amazon Cloud,CentOS,m1.large)具有8Gb RAM,这应该不是问题

我的假设是(因为第二点),泄漏可能不是原因;相反,似乎可能有一个非常大的SINGLE对象。以下主题支持这一理论:: In Node.js using JSON.stringify results in 'process out of memory' error

我真正需要的是找出应用程序崩溃时内存状态的某种方式,或者可能是导致致命错误的堆栈跟踪。

基于我上面的假设,10分钟的堆转储不足(因为对象不会驻留在内存中)。

15 个答案:

答案 0 :(得分:49)

仅仅因为这是目前谷歌的最佳答案,我想我会为我刚遇到的案例添加一个解决方案:

我使用express与ejs模板有这个问题 - 问题是我没有关闭ejs块,文件是js代码 - 像这样:

var url = '<%=getUrl("/some/url")'
/* lots more javascript that ejs tries to parse in memory apparently */

这显然是一个超级特定的情况,OP的解决方案应该在大多数时间使用。但是,OP的解决方案不适用于此(ejs堆栈跟踪不会由ofe表示。)

答案 1 :(得分:21)

我必须向Trevor Norris on this one for helping to modify node.js itself提供巨大的道具,以便在发生此错误时自动生成堆转储。

最终,为我解决这个问题的方法却更为平凡。我写了一些简单的代码,将每个传入的API请求的端点附加到日志文件中。我等待收集~10个数据点(崩溃)并比较在崩溃前60秒运行的端点。我发现在9/10的情况下,一个端点在崩溃之前就被击中了。

从那里开始,只需要深入研究代码。我把所有东西都减少了 - 从我的mongoDB查询中返回更少的数据,只将必要的数据从一个对象传递回回调等等。现在我们已经比平均时间长了6倍而没有任何服务器上的单一崩溃,导致我希望它已经解决了......现在。

答案 2 :(得分:10)

此问题没有单一解决方案。
我阅读了不同的案例,其中大部分都与JS有关,但在我的情况下,例如,由于代码错误,它只是一个破碎的玉模板循环。

我猜这只是节点管理不善的语法错误 检查您的代码或发布它以找到问题。

答案 3 :(得分:7)

在我的情况下,我通过cap production deploy(capistrano)部署Rails 4.2.1并在收到资产预编译期间:

rake stdout:rake aborted! ExecJS :: RuntimeError:致命错误:疏散分配失败 - 处理内存不足 (execjs):1

我之前通过active_admin运行了十几个数据导入,似乎已经耗尽了所有内存

解决方案:首次运行服务器重启和部署....

答案 4 :(得分:4)

对于您正在序列化的对象,它是一个递归问题吗?这个问题在开始时很大,并且在递归成为问题之前内存不足?

我出于这个原因创建了safe-clone-deep npm模块......基本上你会想要做以下事情。

var clone = require('safe-clone-deep');
...
   return JSON.stringify(clone(originalObject));

这将允许您克隆几乎任何将安全序列化的对象。此外,如果其中一个对象继承自Error,它将序列化继承的namemessagestack属性,因为这些属性通常不会序列化。

答案 5 :(得分:1)

在我们的例子中,我们意外地分配了一个巨大的(稀疏的)数组,导致util.format爆炸:

http://grahamrhay.wordpress.com/2014/02/24/fatal-error-js-allocation-failed-process-out-of-memory/

答案 6 :(得分:1)

在我的例子中,我使用[]初始化了一个关联数组(Object)。一旦我将其初始化为{},问题就会消失。

答案 7 :(得分:1)

就我而言,我在开发过程中用于播种数据库的文件导致了泄漏。出于某种原因,节点不喜欢我在文件末尾的多行注释。我无法看到它有什么问题,但是消除过程意味着我知道这个文件的这一部分。

答案 8 :(得分:1)

分析一些案例,最常见的问题是无限循环。在复杂的应用程序中很难解决这个问题,即测试驱动开发很方便!!

答案 9 :(得分:1)

我花了几天时间找出问题的根本原因。仅在AWS EC2实例中,在Webpack构建期间开始出现“ JS-内存不足”错误。虽然在我的本地系统中构建成功。
原因是以下代码:
上一个:
import { ShoppingCartOutlined } from "@material-ui/icons/ShoppingCartOutlined";
已由以下人员修复:
import ShoppingCartOutlined from "@material-ui/icons/ShoppingCartOutlined";

这可能会帮助使用material-ui / icons的人,并最终出现此错误。

答案 10 :(得分:0)

分享这里发生的事情:

我在这个问题上失去了一些日子,直到我发现在某个文件中我从一个静态文件导入一个类,一个构建文件。它使构建过程永无止境。类似的东西:

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

修复真正的源码解决了所有问题。

答案 11 :(得分:0)

在AWS实例上使用npm 5.0.3,我们在npm全局文件夹本身上遇到了权限问题,这可能会导致我们发生这种情况。 我们跑了:sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} 现在它工作正常

答案 12 :(得分:0)

在使用foo :: c a b -> a -> b -> () foo _ _ _ = () bar = foo ((), 42, 'a') 42 'a' -- typechecks 在服务器上安装节点软件包时,我遇到了同样的问题。

npm i

我的解决方案是添加其他标志

FATAL ERROR: Committing semi space failed. Allocation failed - process out of memory
 1: node::Abort() [npm]
 2: 0x556f73a6e011 [npm]
 3: v8::Utils::ReportOOMFailure(char const*, bool) [npm]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [npm]
 5: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [npm]
 6: v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [npm]
 7: v8::internal::Heap::CollectAllGarbage(int, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [npm]
 8: v8::internal::StackGuard::HandleInterrupts() [npm]
 9: v8::internal::Runtime_StackGuard(int, v8::internal::Object**, v8::internal::Isolate*) [npm]
10: 0x159539b040bd
Aborted

希望可以为某人节省时间

答案 13 :(得分:0)

可能是节点版本的问题。 我在运行 React 应用程序时经常遇到同样的问题。我在节点版本 14.7.2 中遇到了这个问题。尝试了很多解决方案,例如增加堆内存、清除缓存、重新安装节点模块。它没有解决问题。最后,将 Node 版本降级到 10.24.1,这停止了错误消息。

答案 14 :(得分:-1)

我有同样的问题。我使用命令“ sudo reboot”重新启动了系统。然后再试一次。奏效了。