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

我正在对付我的节点服务器的问题,我得到一个错误,导致节点的应用程序崩溃:

FATAL ERROR: JS Allocation failed - process out of memory 

我正在使用nodetime来查看内存使用情况。 我想也许我正在缩小这个问题,但是我还是很困惑。 查看这个函数,它使用Mongoose从MongoDB加载一个caching的对象:

 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...? }); }; 

注意注释行。 昨天晚上十一点之前,线路刚好

 callback(err,d); 

我昨晚在晚上11点join了toObject()调用。

现在看我的记忆图:

在这里输入图像描述

注意,在这个变化之前,RSS增长了,但不是堆。 更改后,堆和RSS增长完全相同(直到应用程序崩溃)。 请注意,内存不足错误(以上)是在更改前后发生的。 然而,这个改变似乎已经使得堆大小与其之前的堆平坦(ish)之前的RSS大小相关。

我的假设是,出于某种原因,这意味着toObject()函数将泄漏的数据从RSS移动到堆中,所以不仅RSS正在泄漏,而且还有堆。

这听起来正确吗?

如果有的话…任何想法可能会导致这个问题?

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

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

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

如果“d”对象如此巨大,说它是大对象树的根,当它被反序列化到JSONstring中时会消耗所有的内存?