gpt4 book ai didi

node.js - 了解 Node.js 驻留集大小与堆大小(OOM 错误)

转载 作者:太空宇宙 更新时间:2023-11-03 22:38:56 25 4
gpt4 key购买 nike

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

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() 调用。

现在看看我的内存图表:

enter image description here

请注意,在此更改之前,RSS 会增长,但堆不会增长。更改后,堆和 RSS 的增长完全相同(直到应用程序崩溃)。请注意,内存不足错误(上图)在更改之前和之后均发生。然而,这一变化似乎使堆大小在其泄漏中与 RSS 大小相关联,而在此之前,堆是平坦的。

我的假设是,由于某种原因,这意味着 toObject() 函数将泄漏的数据从 RSS 移至堆中,因此不仅 RSS 泄漏,堆也泄漏。

听起来对吗?

如果是这样...有什么想法可能导致该问题吗?

最佳答案

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

(两者之间有什么区别?,一个是使用的虚拟内存总量,另一个是当前物理 RAM 中的内容,在这种情况下,这仅意味着更改引入了操作系统(操作系统)已决定保留在物理 RAM 中很重要,例如因为它们经常被访问)

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

如果“d”对象如此巨大,假设它是大对象树的根,在反序列化为 JSON 字符串时会消耗所有内存?

关于node.js - 了解 Node.js 驻留集大小与堆大小(OOM 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13613641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com