node.js处理内存不足错误
FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory
我看到这个错误,不太确定它来自哪里。 我正在做的项目有这个基本的工作stream程:
- 从其他来源接收XML文章
- 使用xml2jsparsingXML
- 从新创build的JSON对象中提取所需信息并创build一个新对象。
- 将该对象发送给连接的客户端(使用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下面)。 也许如果你点击某个东西就会点击,你会意识到发生了什么。