Node.js'正常吗;RSS(常驻集大小)是否随每个请求而增长,直到达到某个上限?
我注意到node.js应用程序的RSS(常驻集大小)随着时间的推移而增长,考虑到我的服务器上出现了“js对象分配失败-内存不足”错误,这似乎是一个可能的原因 我设置了以下非常简单的节点应用程序:Node.js'正常吗;RSS(常驻集大小)是否随每个请求而增长,直到达到某个上限?,node.js,v8,Node.js,V8,我注意到node.js应用程序的RSS(常驻集大小)随着时间的推移而增长,考虑到我的服务器上出现了“js对象分配失败-内存不足”错误,这似乎是一个可能的原因 我设置了以下非常简单的节点应用程序: var express = require('express'); var app = express(); app.get('/',function(req,res,next){ res.end(JSON.stringify(process.memoryUsage())); }); app.
var express = require('express');
var app = express();
app.get('/',function(req,res,next){
res.end(JSON.stringify(process.memoryUsage()));
});
app.listen(8888);
只需按住“刷新”热键@http://localhost:8888/我就可以看到RSS/heap/等的增长,直到RSS超过50mb(在我感到厌烦之前)。等待几分钟,然后返回,RSS下降-大概GC已经运行了
我想知道这是否解释了我的实际节点应用程序崩溃的原因。。。我的生产应用程序很快达到大约100Mb的RSS大小,当它崩溃时,它通常在200Mb到300Mb之间。就我所知,这不应该太大(我相信节点应该能够处理1.7Gb左右),但我担心的是,我的生产服务器上的RSS大小会向上(衰减表示崩溃):
这个问题已经很老了,但还没有答案,所以我将把我的问题放在这里,它引用了杰伊·康罗德(Jay Conrod)2013-2014年间的一篇文章,他“致力于优化手机的V8 JavaScript引擎” V8试图在收集垃圾时提高效率,为此,它使用了增量标记和惰性扫描 基本上,增量标记负责跟踪是否可以收集对象 当堆达到某个阈值大小时,增量标记开始 惰性扫描负责在增量标记期间收集标记为垃圾的对象,并执行其他耗时的任务 完成增量标记后,将开始惰性扫描。所有对象都被标记为活的或死的,堆确切地知道通过扫描可以释放多少内存。所有这些记忆不一定要马上释放出来,延迟清理也不会真的伤害到任何东西。因此,垃圾收集器不会同时扫描所有页面,而是根据需要扫描页面,直到扫描完所有页面。此时,垃圾收集周期已经完成,增量标记可以自由地重新开始 我想这就解释了为什么你的服务器要分配这么多内存,直到达到某个上限。
为了更好地理解,我建议阅读Jay Conrod的博文。据我所知,进程会一直保留内存,直到操作系统在其他地方需要内存时交换掉未使用的页面——如果系统上没有其他任何东西在争夺内存,你就不会看到RSS自己崩溃。也许你已经经历了,现在已在
v0.10.22
中修复。在我看来,v8中垃圾收集内存的这种行为似乎很正常