11

我注意到我的 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 大小呈上升趋势(衰减表示崩溃):

在此处输入图像描述

4

1 回答 1

7

这个问题已经很老了,但没有答案,所以我会提出我的问题,它引用了Jay Conrod 2013-2014 年的一篇博客文章,他“致力于优化手机的 V8 JavaScript 引擎”

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

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

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

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

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

我认为这解释了为什么您的服务器会分配如此多的内存,直到达到某个上限。为了更好地理解,我建议阅读 Jay Conrod 的博客文章“V8 之旅:垃圾收集”

于 2015-03-31T13:59:19.427 回答