我正在解决我的节点服务器中的一个问题,我收到一个导致节点应用程序崩溃的错误:
FATAL ERROR: JS Allocation failed - process out of memory
我正在使用 nodetime 来查看内存使用情况。我想也许我正在缩小问题的范围,但我仍然很困惑。查看这个函数,它使用 Mongoose 从 MongoDB 加载缓存对象:
StreamCache.prototype.loadCachedStream = function(_id, callback)
{
this.model.findOne({'_id': _id}, {'objects':1,'last_updated':1}, function(err, d){
callback(err, d ? d.toObject() : null);
//The toObject() seems to cause the RSS to move into heap...?
});
};
注意注释行。昨晚11点之前,线路刚刚
callback(err,d);
我昨晚 11 点添加了 toObject() 调用。
现在看看我的记忆图:
请注意,在此更改之前,RSS 增长但堆没有增长。更改后,堆和 RSS 的增长完全相同(直到应用程序崩溃)。请注意,内存不足错误(上图)在更改前后都发生了。然而,这种变化似乎使堆大小与 RSS 大小的泄漏相关,在此之前堆是平坦的(ish)。
我的假设是,由于某种原因,这意味着 toObject() 函数将泄漏的数据从 RSS 移动到堆中,因此不仅 RSS 泄漏了,堆也泄漏了。
听起来对吗?
如果是这样...任何想法可能导致问题?