我以为我理解了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);