node.js文件内存泄漏?

时间:2012-01-13 20:36:11

标签: file node.js memory-leaks logging

我看到内存泄漏时出现以下代码:

while (true) {
  console.log("Testing.");
}

我已经尝试定义字符串并只使用常量,但它仍会泄漏内存:

var test = "Testing.";
while (true) {
  console.log(test);
}

如果我使用文件而不是标准日志,则会发生同样的泄漏:

var test = "Testing.";
var fh = fs.createWriteStream("test.out", {flags: "a"});
while (true) {
  fh.write(test);
}

我想也许是因为我没有正确关闭文件,但我尝试了这个并且仍然看到了泄漏:

var test = "Testing";
while (true) {
  var fh = fs.createWriteStream("test.out", {flags: "a"});
  fh.end(test);
  fh.destroy();
  fh = null;
}

有没有人知道如何在不泄漏记忆的情况下写东西?

1 个答案:

答案 0 :(得分:10)

这是因为你永远不会给节点一个处理“写成功”事件的机会,所以他们无休止地排队。为了让节点有机会处理它们,你必须让事件循环不时地进行一次迭代。这不会泄漏:

function newLine() {
  console.log("Testing.");
  process.nextTick(newLine);
}
newLine();

在实际使用案例中,这不是问题,因为您几乎不必一次写出如此大量的数据。如果是这样,请不时循环事件循环。

然而,还有第二个问题也出现了nextTick技巧:写入是异步的,如果控制台/文件/什么比节点慢,节点无休止地缓冲数据,直到输出是免费的再次。为了避免这种情况,你必须在写完一些内容后听取drain事件 - 它会告诉你管道什么时候再空闲。见这里:http://nodejs.org/docs/latest/api/streams.html#event_drain_