一尘不染

Node.js“致命错误:JS分配失败-进程内存不足” —可能获得堆栈跟踪?

node.js

好吧…我回到正题。我无法一生解决这个问题。

我收到以下错误:

FATAL ERROR: JS Allocation failed - process out of memory

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

  • 我只能在生产服务器上实现它,而且我的应用程序又大又复杂,因此事实证明很难隔离它
  • 即使堆大小和RSS大小均小于200 Mb,也会发生这种情况,考虑到机器(Amazon Cloud,CentOS,m1.large)具有8Gb RAM,这应该不是问题。

我的假设是
(由于第二点),泄漏可能不是原因。相反,似乎有一个非常大的SINGLE对象。

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

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


阅读 267

收藏
2020-07-07

共1个答案

一尘不染

我必须为TrevorNorris提供一个巨大的支持,以帮助其修改node.js本身,以便在发生此错误时它会自动生成堆转储。

最终,对我来说解决这个问题的方法变得更加平凡。我编写了一些简单的代码,将每个传入API请求的端点附加到日志文件。我等待收集约10个数据点(崩溃),然后比较崩溃前60秒运行的端点。我发现在9/10的情况下,只有一个端点在崩溃之前被命中。

从那里开始,只需要深入研究代码即可。我缩减了所有内容-
从mongoDB查询返回的数据更少,仅将对象中必要的数据传递回回调等。现在,我们的速度比平时长了6倍,而在任何服务器上都没有发生崩溃,这导致我 希望
现在解决。

2020-07-07