10

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 node
3941 root 20 0 32944 7460 4084 S 2.948 3.489 0:01.59 node
3941 root 20 0 32944 7516 4084 S 2.948 3.515 0:01.68 node
3941 root 20 0 33968 8400 4112 S 2.948 3.928 0:02.15 node
3941 root 20 0 33968 8920 4112 S 3.275 4.171 0:02.98 node
3941 root 20 0 33968 8964 4112 S 2.948 4.192 0:03.07 node
3941 root 20 0 33968 9212 4112 S 2.953 4.308 0:03.16 node
3941 root 20 0 33968 9212 4112 S 2.953 4.308 0:03.25 节点
3941 根 20 0 33968 9212 4112 S 3.276 4.308 0:03.35 节点
3941 根 20 0 33968 9212 4112 S 2.950 4.308 0:03.44 节点

4

2 回答 2

4

不知道为什么,但显然如果你在函数 nodejs 的范围内引用超时对象,就会正确地进行垃圾收集。

function redx(){
      var t = setTimeout(function(){ redx() },50);
      console.log('hi');
}

redx();
于 2013-04-18T09:28:38.957 回答
3

实际上,我认为这可能正是 V8 垃圾收集器的工作方式。

在我的系统上,节点堆往往会增加到 48 MB 然后稳定下来,所以我认为如果你让程序长时间运行,内存消耗最终会稳定下来。

您可以通过使用 V8 命令行选项之一启动节点来获得有关 GC 何时/如何启动的信息: --trace_gc 标志。

在您第一次尝试使用 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 );
}

使用 Redis 连接/断开连接的内存消耗演变

在这里,60 MB 之后的稳定性似乎相当明显。

于 2013-04-18T10:08:10.920 回答