我注意到我的node.js应用程序的RSS(Resident Set Size)随着时间的推移而增长,并且考虑到我的服务器上有"JS对象分配失败 - 内存不足"错误,这似乎是一个可能的原因.
我设置了以下非常简单的Node应用程序:
var express = require('express');
var app = express();
app.get('/',function(req,res,next){
res.end(JSON.stringify(process.memoryUsage()));
});
app.listen(8888);
Run Code Online (Sandbox Code Playgroud)
通过简单地按住"刷新"热键@ http:// localhost:8888 /我可以观看RSS /堆/等.增长,直到RSS远远高于50mb(在我感到无聊之前).等待几分钟然后回来,RSS下降 - 可能是GC运行了.
我试图弄清楚这是否解释了为什么我的实际节点应用程序崩溃...我的生产应用程序快速达到大约100Mb的RSS大小,当它崩溃时它通常在200Mb-300Mb之间.尽我所知,这不应该太大(节点应该能够处理1.7Gb左右,我相信)但是我仍然担心我的生产服务器上的RSS大小趋势向上(衰落)代表崩溃):

这个问题已经很老了,但还没有答案,所以我会抛出我的问题,它引用了Jay Conrod 在 2013-2014 年发表的一篇博客文章,他“致力于为手机优化 V8 JavaScript 引擎”。
V8 试图在收集垃圾时提高效率,为此它使用增量标记和延迟清除。
基本上增量标记负责跟踪您的对象是否可以被收集。
当堆达到某个阈值大小时,开始增量标记。
懒惰清扫负责收集增量标记期间标记为垃圾的对象并执行其他耗时任务。
一旦增量标记完成,懒惰扫描就开始了。所有对象都被标记为存活或死亡,并且堆确切地知道通过清除可以释放多少内存。尽管如此,所有这些内存不一定必须立即释放,延迟清扫不会真正伤害任何东西。因此,垃圾收集器不是同时清扫所有页面,而是根据需要清扫页面,直到所有页面都被清扫完毕。至此,垃圾回收周期完成,增量标记可以重新开始。
我认为这解释了为什么您的服务器分配如此多的内存直到达到某个上限。为了更好地理解,我建议阅读 Jay Conrod 的博客文章“V8 之旅:垃圾收集”。