v0.10.4
这是导致内存使用量不断增加的简单循环:
function redx(){
setTimeout(function(){ redx() },1000);
console.log('loop');
}
redx();
我做错了什么?
好的,只是尝试了引用范围中的超时对象的建议,似乎垃圾收集在大约40秒后启动,这是TOP的缩写日志:
3941 root 20 0 32944 7284 4084 S 4.587 3.406 0:01.32节点
3941 root 20 0 32944 7460 4084 S 2.948 3.489 0:01.59节点
3941 root 20 0 32944 7516 4084 S 2.948 3.515 0:01.68节点
3941 root 20 0 33968 8400 4112 S 2.948 3.928 0:02.15节点
3941 root 20 0 33968 8920 4112 S 3.275 4.171 0:02.98节点
3941 root 20 0 33968 8964 4112 S 2.948 4.192 0:03.07节点
3941 root 20 0 33968 9212 4112 S 2.953 4.308 0:03.16节点
3941 root 20 0 33968 9212 4112 S 2.953 4.308 0:03.25节点
3941 root 20 0 33968 9212 4112 S 3.276 4.308 0:03.35节点
3941 root 20 0 33968 9212 4112 S 2.950 4.308 0:03.44 node
答案 0 :(得分:4)
不知道为什么但显然如果你在函数nodejs的范围内引用超时对象,那么将正确地进行垃圾收集。
function redx(){
var t = setTimeout(function(){ redx() },50);
console.log('hi');
}
redx();
答案 1 :(得分:3)
实际上,我认为这可能就是V8垃圾收集器的工作方式。
在我的系统上,节点堆往往会增加到48 MB,然后稳定下来,所以我认为如果你让程序运行很长时间,内存消耗最终会稳定下来。
您可以通过使用V8命令行选项之一启动节点来获取有关GC何时/如何启动的信息: - trace_gc flag。
在您第一次尝试使用Redis时,您在每次通话时都会系统地连接/断开与Redis的连接。这往往会产生垃圾。您应该打开一次连接并多次使用它。然而,即使我这样做,内存消耗也趋于稳定。以下是Redis上这个例子中内存消耗的演变:
// something close to your initial function (when Redis was still in the picture)
function redx(){
var client = redis.createClient();
client.get("tally", function(err, reply) {
client.quit();
});
setTimeout(function(){ redx() }, 50 );
}
这里,60 MB后的稳定性似乎非常明显。