FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory
我看到了这个错误,并不确定它的来源。我正在研究的项目有这个基本的工作流程:
正在使用的节点模块是:
当我收到一个XML数据包时,我要做的第一件事是将它写入log.txt文件,以防需要稍后检查。我首先fs.readFile
获取当前内容,然后编写新内容+旧内容。 log.txt文件在上次崩溃时可能大约是2400KB,但是在重新启动服务器后它又恢复正常,所以我不相信这是问题所在。
我在崩溃发生之前没有在日志中看到一个数据包,所以我不确定导致崩溃的是什么......没有连接新客户端,没有发送消息......没有解析任何内容。
看到节点正在不断运行,我应该在我正在使用的每个对象之后使用delete <object>
,例如var now = new Date()
,我用它来比较过去发生的事情。或者,在我将其传递给回调之后,步骤3中的结果对象?
我在新客户端连接的情况下保留一个主对象,他们需要查看过去的消息,但是对象被删除,它们不会停留在服务器的生命周期,直到它们在客户端完成。目前,我正在做这样的事情
function parsingFunction(callback) {
//Construct Object
callback(theConstructedObject);
}
parsingFunction(function (data) {
masterObject[someIdentifier] = data;
});
作为排除故障的另一个步骤,我在解析器从process.memoryUsage().heapUsed
开始之前转发parser.on('end', function() {..});
并解析了几个xml数据包。在整个测试过程中使用的最高堆大约为10-12 MB,但在正常情况下,程序大约为4-5 MB。我不认为这特别是一个交易破坏者,但可能有助于找到问题。
答案 0 :(得分:2)
也许你不小心以递归方式关闭了对象。一个疯狂的例子:
function f() {
var shouldBeDeleted = function(x) { return x }
return function g() { return shouldBeDeleted(shouldBeDeleted) }
}
要查找正在发生的事情,请启动node-inspector并在可疑的内存不足错误之前设置一个断点。然后单击“关闭”(右边框附近的范围变量下方)。也许如果你点击某些东西会点击,你会意识到会发生什么。