3

我正在解决我的节点服务器中的一个问题,我收到一个导致节点应用程序崩溃的错误:

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 泄漏了,堆也泄漏了。

听起来对吗?

如果是这样...任何想法可能导致问题?

4

1 回答 1

0

我认为堆/RSS 相关性与您遇到的内存不足问题无关。

(无论如何,两者有什么区别?一个是使用的虚拟内存总量,另一个是物理RAM中的内容,在这种情况下,这仅意味着更改引入了OS(OS)具有的数据结构决定保留在物理 RAM 中很重要,例如因为它们经常被访问)

您所说的问题原因在于 d.toJSON() 调用,为什么您认为单独的 toJSON() 不会导致内存不足错误?

如果“d”对象非常大,比如说它是大对象树的根,当它被反序列化为 JSON 字符串时会消耗所有内存怎么办?

于 2012-11-28T20:49:46.267 回答