Node.js来自简单程序的无法解释的内存增长(泄漏?)
我认为我了解node/v8内存管理的工作原理,但显然不了解 下面的程序展示了一个rss,它在heapUsed增长时或多或少地持续增长,然后在垃圾收集器运行时收缩 最近的一项测试让RSS从约10MB开始,在7分钟内增长到约14MB。然后它继续生长,一小时又一小时 我已经尝试将报告中的所有变量设置为null,并尝试删除它们,但这两个变量都没有任何效果 我已经尝试手动调用垃圾收集器。这会减缓增长,但不会消除增长 有人能解释一下为什么会这样吗?这是正常的行为,我只是没有等待足够长的时间让gc在RSS上工作?这只是我所写的软件中表现出类似行为的一个简单示例Node.js来自简单程序的无法解释的内存增长(泄漏?),node.js,memory-leaks,v8,Node.js,Memory Leaks,V8,我认为我了解node/v8内存管理的工作原理,但显然不了解 下面的程序展示了一个rss,它在heapUsed增长时或多或少地持续增长,然后在垃圾收集器运行时收缩 最近的一项测试让RSS从约10MB开始,在7分钟内增长到约14MB。然后它继续生长,一小时又一小时 我已经尝试将报告中的所有变量设置为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);
您运行的节点版本是什么操作系统?在节点为v0.10.32的Xubuntu 14.04上,我的RSS大小增加了一段时间,然后稳定在33MB左右。已经运行了大约8个小时。我使用的是0.10.29。在更高版本中确认症状是一个很好的数据点。如果具有节点专业知识的人能够为节点编写一份最佳实践文档,这肯定会很有用。有一些博客文章是关于网络服务器的,但它们主要是针对那些将网络服务器组装在一起的人。我使用node的几乎所有功能都是创建实时数据传输客户端和服务器。对我来说,这种行为似乎并没有那么糟糕,因为它稳定了。我运行的许多节点程序在消耗135兆内存(从17MB开始)之前都不会“稳定”。在任何给定的时间都有26-30个这样的任务在运行,服务于不同的端口并做其他事情。这意味着以这种神秘的方式使用了大约3+GB的内存。我想我很想了解是什么在消耗内存来帮助更新任务以获得最佳内存消耗。