node.js处理内存不足错误

A W*_* It 8 memory memory-leaks node.js

FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory

我看到了这个错误,并不确定它的来源.我正在研究的项目有这个基本的工作流程:

  1. 从其他来源接收XML帖子
  2. 使用xml2js解析XML
  3. 从新创建的JSON对象中提取所需信息并创建新对象.
  4. 将该对象发送到连接的客户端(使用socket.io)

使用的节点模块是:

当我收到一个XML数据包时,我要做的第一件事就是将它写入log.txt文件,以便稍后需要检查.我首先fs.readFile获取当前内容,然后写入新内容+旧内容.log.txt文件在上次崩溃时可能大约是2400KB,但是在重新启动服务器后它又恢复正常,所以我不相信这是问题所在.

在崩溃发生之前我没有看到日志中的数据包,所以我不确定导致崩溃的是什么...没有连接新客户端,没有发送消息......没有解析任何内容.

编辑

看到节点在不断运行,我应该delete <object>在我正在使用的每个对象之后使用它,例如var now = new Date()我用它来比较过去发生的事情.或者,在我将其传递给回调后,从第3步开始的结果对象?

编辑2

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

function parsingFunction(callback) {
    //Construct Object
    callback(theConstructedObject);
}

parsingFunction(function (data) {
   masterObject[someIdentifier] = data;
});
Run Code Online (Sandbox Code Playgroud)

编辑3

作为故障排除的另一个步骤,我process.memoryUsage().heapUsed在解析器启动之前将其转储parser.on('end', function() {..});并解析了几个xml数据包.在整个测试过程中使用的最高堆大约为10-12 MB,但在正常情况下,程序大约为4-5 MB.我不认为这特别是一个交易破坏者,但可能有助于找到问题.

nal*_*ply 2

也许您不小心递归地关闭了对象。一个疯狂的例子:

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

  return function g() { return shouldBeDeleted(shouldBeDeleted) }
}
Run Code Online (Sandbox Code Playgroud)

要查找正在发生的情况,请启动节点检查器并在可疑的内存不足错误之前设置断点。然后单击“关闭”(位于右边框附近的范围变量下方)。也许如果你点击周围的东西,就会点击一些东西,然后你就会意识到会发生什么。