Node.js";致命错误:JS分配失败-进程内存不足--可以得到堆栈跟踪吗?

Node.js";致命错误:JS分配失败-进程内存不足--可以得到堆栈跟踪吗?,node.js,Node.js,嗯。。。我又回到原点了。我一辈子都搞不懂这个 我得到以下错误: FATAL ERROR: JS Allocation failed - process out of memory 我可以列举几十件(是的,几十件)我试图找到这个问题的根源的事情,但实际上这太多了。以下是关键点: 我只能在我的生产服务器上实现,而我的应用程序又大又复杂,因此很难将其隔离 即使堆大小和RSS大小都小于200 Mb,也会发生这种情况,考虑到机器(Amazon Cloud、CentOS、m1.large)有8Gb RA

嗯。。。我又回到原点了。我一辈子都搞不懂这个

我得到以下错误:

FATAL ERROR: JS Allocation failed - process out of memory
我可以列举几十件(是的,几十件)我试图找到这个问题的根源的事情,但实际上这太多了。以下是关键点:

  • 我只能在我的生产服务器上实现,而我的应用程序又大又复杂,因此很难将其隔离
  • 即使堆大小和RSS大小都小于200 Mb,也会发生这种情况,考虑到机器(Amazon Cloud、CentOS、m1.large)有8Gb RAM,这应该不是问题
我的假设是(由于第二点),泄漏可能不是原因;更确切地说,似乎只有一个物体非常大。以下线索支持这一理论:

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


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

这可能是您正在序列化的对象上的递归问题吗?该对象刚开始很大,在递归成为问题之前内存不足

我创建npm模块就是为了这个原因。。。基本上,您将要执行以下操作

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

这将允许您克隆几乎任何对象,然后安全地进行序列化。此外,如果其中一个对象继承自
Error
,它将序列化继承的
名称
消息
堆栈
属性,因为这些属性通常不会序列化。

我必须提供大量支持,以便在发生此错误时自动生成堆转储

不过,最终解决我这个问题的方法要平凡得多。我编写了一些简单的代码,将每个传入API请求的端点附加到日志文件中。我等待收集10个数据点(崩溃),并比较崩溃前60秒运行的端点。我发现在9/10的案例中,只有一个端点在碰撞前被击中


从那时起,这只是一个深入挖掘代码的问题。我缩减了所有内容——从mongoDB查询返回的数据更少,只将必要的数据从一个对象传递回回调,等等。现在,我们比平均时间多了6倍,没有任何服务器发生一次崩溃,这让我希望它能得到解决。。。就目前而言。

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

我在使用带有ejs模板的express时遇到了这个问题-问题是我未能关闭ejs块,文件是js代码-类似于以下内容:

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

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


这个问题没有单一的解决方案。
我阅读了不同的案例,大多数都与JS有关,但在我的案例中,例如,由于代码错误,一个破碎的jade模板循环是无限的

我猜这只是一个语法错误,节点管理不好。

检查代码或发布代码以查找问题。

在我的例子中,我使用[]初始化了关联数组(对象)。当我把它初始化为{}时,问题就消失了。

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

在我的例子中,我是通过cap生产部署(capistrano)部署Rails 4.2.1的,在收到的资产预编译期间:

rake标准输出:rake中止! ExecJS::RuntimeError:致命错误:疏散分配失败-进程内存不足 (行政长官):1

早些时候,我通过active_admin运行了十几个数据导入,它似乎已经耗尽了所有RAM


解决方案:服务器重新启动和部署第一次运行….

分析许多情况,最常见的问题是无限循环。这在一个复杂的应用程序中是很难解决的,而测试驱动开发正是在这个应用程序中实现的

在这里分享发生的事情:

我因为这个问题耽误了几天,直到我发现在某个文件中,我从一个静态文件(一个构建文件)导入了一个类。它使构建过程永远不会结束。比如:

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

修复到真实源代码解决了所有问题。

在AWS实例上使用npm 5.0.3时,我们在npm全局文件夹本身上出现了权限问题,这可能导致我们出现这种情况。 我们运行:
sudochown-R$(whoami)$(npm-config-get-prefix)/{lib/node_模块,bin,share}

现在它工作正常了

我花了几天时间找到了问题的根本原因。“JS-进程内存不足”错误仅在AWS EC2实例中的webpack生成过程中发生。但是,在我的本地系统中构建成功。
原因是以下代码:
以前的:
从“@material ui/icons/ShoppingCartOutlined”导入{ShoppingCartOutlined}”
已由以下人员修复:
从“@material ui/icons/ShoppingCartOutlined”导入ShoppingCartOutlined

这可能有助于某人使用材质ui/图标,并最终导致此错误。

我也有同样的问题。 所以我尝试了这个:node--max old space size=4096 index.js
这是可行的。

在使用
npmi
在服务器上安装节点包时,我遇到了同样的问题

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
我的解决方案是添加额外的标志

node --max-old-space-size=250 `which npm` i

希望它能为某些人节省时间

只是确保基本的基础已经覆盖。您确定进程正在运行吗