FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory
我看到这个错误,但不太确定它来自哪里。我正在从事的项目有以下基本工作流程:
- 从其他来源接收 XML 帖子
- 使用解析 XMLxml2js https://github.com/maqr/node-xml2js/
- 从新创建的 JSON 对象中提取所需信息并创建一个新对象。
- 将该对象发送到连接的客户端(使用socket.io)
使用的节点模块有:
- xml2js
- 套接字.io
- 编舞
- mysql https://github.com/felixge/node-mysql
当我收到 XML 数据包时,我做的第一件事就是将其写入 log.txt 文件,以备稍后需要查看某些内容。我先来fs.readFile
获取当前内容,然后写入新内容+旧内容。 log.txt 文件在上次崩溃时可能约为 2400KB,但重新启动服务器后它又工作正常,所以我不认为这是问题所在。
在崩溃发生之前,我在日志中没有看到数据包,因此我不确定导致崩溃的原因...没有新客户端连接,没有发送消息...没有解析任何内容。
Edit
鉴于节点不断运行,我应该使用delete <object>
在我使用的每个对象都达到其目的之后,例如var now = new Date()
我用它来与过去发生的事情进行比较。或者,将步骤 3 中的结果对象传递给回调后?
Edit 2
我保留一个主对象,以防新客户端连接,他们需要查看过去的消息,尽管对象被删除,但它们不会在服务器的生命周期内保留,直到它们在客户端完成为止。目前,我正在做这样的事情
function parsingFunction(callback) {
//Construct Object
callback(theConstructedObject);
}
parsingFunction(function (data) {
masterObject[someIdentifier] = data;
});
Edit 3
作为故障排除的另一个步骤,我转储了process.memoryUsage().heapUsed
就在解析器开始之前parser.on('end', function() {..});
并解析了几个xml数据包。整个测试过程中使用的最高堆约为 10-12 MB,但在正常情况下程序的占用量约为 4-5 MB。我不认为这特别会破坏交易,但可能有助于找到问题。
也许您不小心递归地关闭了对象。一个疯狂的例子:
function f() {
var shouldBeDeleted = function(x) { return x }
return function g() { return shouldBeDeleted(shouldBeDeleted) }
}
要查找正在发生的情况,请启动节点检查器并在可疑的内存不足错误之前设置断点。然后单击“关闭”(位于右边框附近的范围变量下方)。也许如果你点击周围的东西,就会点击一些东西,然后你就会意识到会发生什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)