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
希望它能为某些人节省时间只是确保基本的基础已经覆盖。您确定进程正在运行吗