我看到内存泄漏时出现以下代码:
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;
}
有没有人知道如何在不泄漏记忆的情况下写东西?
答案 0 :(得分:10)
这是因为你永远不会给节点一个处理“写成功”事件的机会,所以他们无休止地排队。为了让节点有机会处理它们,你必须让事件循环不时地进行一次迭代。这不会泄漏:
function newLine() {
console.log("Testing.");
process.nextTick(newLine);
}
newLine();
在实际使用案例中,这不是问题,因为您几乎不必一次写出如此大量的数据。如果是这样,请不时循环事件循环。
然而,还有第二个问题也出现了nextTick
技巧:写入是异步的,如果控制台/文件/什么比节点慢,节点无休止地缓冲数据,直到输出是免费的再次。为了避免这种情况,你必须在写完一些内容后听取drain
事件 - 它会告诉你管道什么时候再空闲。见这里:http://nodejs.org/docs/latest/api/streams.html#event_drain_