我以为我理解了node / v8内存管理是如何工作的,但显然不是 .

以下程序展示的rss在heapUsed增长时或多或少地增长,然后在垃圾收集器运行时收缩 .

最近的测试让RSS开始大约10 MB,并在7分钟内增长到大约14MB . 然后它继续增长,一小时又一小时 .

我_582458已尝试删除它们但这些都没有任何效果 .

我试过手动调用垃圾收集器 . 这会减缓增长但不会消除增长 .

有人可以解释为什么会这样吗?这是正常的行为吗?我只是等待gc在RSS上工作的时间不够长?这只是我编写过的具有类似行为的软件的一个简单示例 .

var startTime = new Date();

var memInfo = {
    rss: 0,
    heapTotal: 0,
    heapUsed: 0
}

function report () {
    var endTime, timeDiff, seconds, minutes, hours, days, mem;

    endTime = new Date();
    timeDiff = (endTime - startTime) / 1000;
    seconds = Math.round(timeDiff % 60);
    timeDiff = Math.floor(timeDiff / 60);
    minutes = Math.round(timeDiff % 60);
    timeDiff = Math.floor(timeDiff / 60);
    hours = Math.round(timeDiff % 24);
    timeDiff = Math.floor(timeDiff / 24);
    days = timeDiff;

    console.log('Up for %d days %d hours %d minutes %d seconds', days, hours, minutes, seconds);

    var mem = process.memoryUsage();
    if (mem.rss > memInfo.rss) { memInfo.rss = mem.rss; }
    if (mem.heapTotal > memInfo.heapTotal) { memInfo.heapTotal = mem.heapTotal; }
    if (mem.heapUsed > memInfo.heapUsed) { memInfo.heapUsed = mem.heapUsed; }

    console.log('Latest', process.memoryUsage());
    console.log('Max   ', memInfo);
};

var timer = setInterval(report, 1000);

一个更简单的例子就是:

var memInfo = {
    rss: 0,
    heapTotal: 0,
    heapUsed: 0
}

var timer = setInterval(function () {
    var mem = process.memoryUsage();
    if (mem.rss > memInfo.rss) { memInfo.rss = mem.rss; }
    if (mem.heapTotal > memInfo.heapTotal) { memInfo.heapTotal = mem.heapTotal; }
    if (mem.heapUsed > memInfo.heapUsed) { memInfo.heapUsed = mem.heapUsed; }

    console.log('Latest', process.memoryUsage());
    console.log('Max   ', memInfo);

}, 1000);