Node.js“致命错误:JS分配失败 – 进程内存不足” – 可能得到堆栈跟踪?
那么…我回到原点。 我无法弄清楚我的生活。
我收到以下错误:
FATAL ERROR: JS Allocation failed - process out of memory
我可以列举几十个(是的,几十个)我试图解决这个问题的根源,但是真的太多了。 所以这里是关键点:
- 我只能把它发生在我的生产服务器上,而我的应用程序又大又复杂,所以隔离起来非常困难
- 即使堆大小和RSS大小都小于200 Mb,这也不会成为问题,因为机器(Amazon Cloud,CentOS,m1.large)具有8Gb RAM
我的假设是 (由于第二点),泄漏可能不是原因; 相反,它似乎有可能是一个非常大的单个对象。 以下线程备份了这个理论: 在Node.js中使用JSON.stringify会导致'进程内存不足'错误
我真正需要的是找出应用程序崩溃时内存的状态,或者导致FATAL ERROR的堆栈跟踪。
基于我上面的假设,一个10分钟的堆转储是不够的(因为对象不会驻留在内存中)。
正因为这是Google目前的最佳答案,所以我想为我刚刚碰到的一个案例添加一个解决scheme:
我有这个问题使用快递与ejs模板 – 问题是,我没有closures一个ejs块,该文件是js代码 – 这样的事情:
var url = '<%=getUrl("/some/url")' /* lots more javascript that ejs tries to parse in memory apparently */
这显然是一个超级特例,OP的解决scheme应该在大部分时间使用。 然而,OP的解决scheme不会为此工作(ejs堆栈跟踪不会被浮出水面)。
我必须给Trevor Norris提供巨大的道具来帮助修改node.js本身 ,以便在发生这种错误时自动生成堆转储。
但是,最终为我解决了这个问题,却是更为平凡的。 我写了一些简单的代码,将每个传入API请求的端点附加到日志文件中。 我等待收集~10个数据点(崩溃),并比较崩溃前60秒运行的端点。 我发现9/10的情况下,一个单一的端点,就在撞车之前被击中。
从那里,这只是一个深入挖掘代码的问题。 我减less了一切 – 从我的mongoDB查询中返回的数据较less,仅将必要的数据从对象传递回callback函数等。现在,我们已经比任何服务器上的平均时间延长了6倍,没有任何一个服务器崩溃,导致我希望现在解决了。
这个问题没有单一的解决scheme。
我读了不同的例子,其中大部分与JS有关,但就我而言,例如,只是一个由于代码错误而无法完成的玉石模板循环。
我想这只是一个语法错误,节点pipe理不好。
检查您的代码或张贴它find问题。
在我的情况下,我通过cap production部署(capistrano)部署Rails 4.2.1,并在收到的资产预编译期间:
耙标准输出:耙中止! ExecJS :: RuntimeError:致命错误:疏散分配失败 – 进程内存不足(execjs):1
我之前通过active_admin运行了十几个数据导入,看起来已经用完了所有的RAM
解决scheme:服务器重新启动和部署运行第一次
它可能是一个你正在序列化的对象的recursion问题,这只是大开始,并在recursion成为一个问题之前耗尽内存?
由于这个原因,我创build了safe-clone-deep npm模块…基本上,您需要执行以下操作。
var clone = require('safe-clone-deep'); ... return JSON.stringify(clone(originalObject));
这将允许你克隆几乎任何将安全序列化的对象。 此外,如果其中一个对象从Error
inheritance,则它将序列化inheritance的name
, message
和stack
属性,因为这些属性通常不会序列化。
在我们的例子中,我们不小心分配了一个巨大的(稀疏的)数组,导致util.format炸毁:
http://grahamrhay.wordpress.com/2014/02/24/fatal-error-js-allocation-failed-process-out-of-memory/
在我的情况下,我用[]初始化了一个关联数组(Object)。 只要我把它初始化,问题就消失了。
在我的情况下,我正在使用一个文件在开发过程中种子数据库正在导致泄漏。 出于某种原因,节点不喜欢我在文件末尾的多行注释。 我看不出有什么问题,但一个消除的过程意味着我知道这是这个文件的这一部分。
分析一些案例,最常见的问题是无限循环。 这将是一个复杂的应用程序,这是testing驱动开发方便的地方很难解决!
分享这里发生的事情:
我在这个问题上失去了一些日子,直到我发现在某个文件中,我从一个静态文件,一个build立的文件导入了一个类。 它使构build过程永不结束。 就像是:
import PropTypes from "../static/build/prop-types";
解决真正的来源解决了所有的问题。
在AWS实例上使用npm 5.0.3,我们对npm全局文件夹本身有权限问题,这可能导致这种情况发生在我们身上。 我们运行: sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
现在它工作正常