Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js'正常吗;RSS(常驻集大小)是否随每个请求而增长,直到达到某个上限?_Node.js_V8 - Fatal编程技术网

Node.js'正常吗;RSS(常驻集大小)是否随每个请求而增长,直到达到某个上限?

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.

我注意到node.js应用程序的RSS(常驻集大小)随着时间的推移而增长,考虑到我的服务器上出现了“js对象分配失败-内存不足”错误,这似乎是一个可能的原因

我设置了以下非常简单的节点应用程序:

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中垃圾收集内存的这种行为似乎很正常