【问题标题】:Is it normal for Node.js' RSS (Resident Set Size) to grow with each request, until reaching some cap?Node.js 的 RSS(驻留集大小)随着每个请求而增长,直到达到某个上限是否正常?
【发布时间】:2012-12-02 04:21:18
【问题描述】:

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

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

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/etc。增长,直到 RSS 超过 50mb(在我感到无聊之前)。等待几分钟然后回来,RSS 下降 - 推测 GC 已经运行。

我试图弄清楚这是否解释了我的实际节点应用程序崩溃的原因......我的生产应用程序很快达到了大约 100Mb 的 RSS 大小,当它崩溃时它通常在 200Mb-300Mb 之间。据我所知,这不应该太大(我相信节点应该能够处理 1.7Gb 左右),但我仍然担心我的生产服务器上的 RSS 大小呈上升趋势(衰减表示崩溃):

【问题讨论】:

  • 据我所知,进程一直挂在内存上,直到操作系统在其他地方需要内存时换出未使用的页面——如果没有其他内容,你不会看到 RSS 自行关闭系统正在争夺内存。
  • 也许您已经体验过infamous Walmart memory leak,现在已在v0.10.22 中修复。
  • 对我来说,v8 中垃圾收集内存的这种行为似乎很正常

标签: node.js v8


【解决方案1】:

这个问题已经很老了,但没有答案,所以我会提出我的问题,它引用了 Jay Conrod 从 2013 年到 2014 年的 blog post,他 “致力于优化 V8 JavaScript 引擎手机”

V8 在收集垃圾时尝试提高效率,为此它使用增量标记和延迟清除

基本上增量标记负责跟踪您的对象是否可以被收集。

当堆达到某个阈值大小时开始增量标记。

懒惰扫描负责在增量标记期间收集标记为垃圾的对象并执行其他耗时的任务。

增量标记完成后,就会开始延迟扫描。所有对象都被标记为存活或死亡,并且堆确切地知道可以通过清除释放多少内存。不过,所有这些内存不一定要立即释放,延迟清扫不会真正伤害任何东西。因此,垃圾收集器不是同时清扫所有页面,而是根据需要清扫页面,直到所有页面都被清扫。至此,垃圾回收周期完成,增量标记可以重新开始。

我认为这解释了为什么您的服务器在达到某个上限之前会分配如此多的内存。 为了更好地理解,我建议阅读 Jay Conrod 的博文 "A tour of V8: Garbage Collection"

【讨论】:

    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2020-12-21
    • 2019-10-06
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多