node.js处理内存不足错误

时间:2010-11-26 17:42:37

标签: memory memory-leaks node.js

FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory

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

  1. 从其他来源接收XML帖子
  2. 使用xml2js
  3. 解析XML
  4. 从新创建的JSON对象中提取所需信息并创建一个新对象。
  5. 将该对象发送到已连接的客户端(使用socket.io)
  6. 正在使用的节点模块是:

    • xml2js
    • socket.io
    • 编舞
    • mysql

    当我收到一个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;
    });
    

    编辑3

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

1 个答案:

答案 0 :(得分:2)

也许你不小心以递归方式关闭了对象。一个疯狂的例子:

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

  return function g() { return shouldBeDeleted(shouldBeDeleted) }
}

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