node.js处理内存不足错误

FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory

我看到这个错误,不太确定它来自哪里。 我正在做的项目有这个基本的工作stream程:

  1. 从其他来源接收XML文章
  2. 使用xml2jsparsingXML
  3. 从新创build的JSON对象中提取所需信息并创build一个新对象。
  4. 将该对象发送给连接的客户端(使用socket.io)

正在使用的节点模块是:

  • xml2js
  • socket.io
  • 编舞
  • MySQL的

当我收到一个XML数据包时,首先我要做的事情是把它写到一个log.txt文件中,以备稍后需要检查的地方。 我先fs.readFile得到当前的内容,然后写新的内容+旧的。 log.txt文件大概是在上次崩溃时的2400KB左右,但重新启动服务器后,它再次正常工作,所以我不认为这是问题。

在发生崩溃之前,我没有在日志中看到数据包,所以我不知道是什么原因导致崩溃…没有连接新客户端,没有消息正在发送…没有任何内容正在被parsing。

编辑

看到节点运行不断,我应该使用delete <object>之后,我使用的每个对象服务于其目的,如var now = new Date() ,我用它来比较过去发生的事情。 或者,我把它传递给callback后,来自第3步的结果对象?

编辑2

在新客户端连接的情况下,我保留一个主对象,他们需要查看过去的消息,虽然对象被删除了,但是它们并不停留在服务器的生命周期中,直到它们在客户端完成为止。 目前,我正在做这样的事情

 function parsingFunction(callback) { //Construct Object callback(theConstructedObject); } parsingFunction(function (data) { masterObject[someIdentifier] = data; }); 

编辑3

作为解决问题的另一个步骤,我倾倒了parser.on('end', function() {..});之前的分析器开始的process.memoryUsage().heapUsed parser.on('end', function() {..}); 并分析了几个XML包。 整个testing中使用的最高堆大约是10-12MB,但是在正常情况下,程序大约在4-5MB。 我不认为这是一个特别的问题,但可能有助于发现问题。

也许你不小心closures对象的recursion。 一个疯狂的例子:

 function f() { var shouldBeDeleted = function(x) { return x } return function g() { return shouldBeDeleted(shouldBeDeleted) } } 

要发现发生了什么事情火灾的节点检查器,并设置一个断点之前,怀疑内存不足错误。 然后点击“Closure”(右边界附近的范围variables下面)。 也许如果你点击某个东西就会点击,你会意识到发生了什么。