我认为我理解node / v8内存管理是如何工作的,但显然不是。
以下程序展示的rss在heapUsed增长时或多或少地增长,然后在垃圾收集器运行时收缩。
最近的一次测试让RSS开始大约10 MB,并在7分钟内增长到大约14MB。然后它一点一点地继续增长。
我已经尝试将report()中的所有变量设置为null,我尝试删除它们,但这些都没有任何效果。
我试过手动调用垃圾收集器。这会减缓增长但不会消除它。
有人可以解释为什么会这样吗?这是正常的行为,我只是等待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);