File node.js文件内存泄漏?

File node.js文件内存泄漏?,file,node.js,memory-leaks,logging,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) {
  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;
}

有人对我应该如何在不泄漏内存的情况下编写东西有任何提示吗?

之所以会出现这种情况,是因为您从未给节点一个处理“写入成功”事件的机会,所以它们会无休止地排队。为了给节点一个处理它们的机会,您必须让事件循环不时地进行一次迭代。这不会泄漏:

function newLine() {
  console.log("Testing.");
  process.nextTick(newLine);
}
newLine();
在实际用例中,这不是问题,因为您几乎不必一次写出如此大量的数据,这才是重要的。如果有,则不时循环事件循环


然而,
nextTick
技巧也存在第二个问题:写入是异步的,如果控制台/文件/任何东西比节点慢,节点会无限地缓冲数据,直到输出再次空闲。为了避免这种情况,在编写一些内容之后,您必须监听
drain
事件-它告诉您管道何时再次空闲。请参见此处:

我可以使用文件处理程序(
fs.createWriteStream
)复制您的解决方案,但如果我尝试使用
console.log
,仍然会出现内存泄漏<代码>函数writeConsole(){console.log(“test”);if(typeof(gc)==“function”)gc();process.nextTick(writeConsole);}writeConsole()当使用
节点test.js运行上述代码块时,我在每次迭代中都会看到我的内存使用率气球。当我以
节点的形式运行它时——expose gc test.js
,我看不到任何常量的增加。@滑稽:它不经常执行gc循环,这是低效的。让它运行一段时间,你会看到内存使用率最终下降到起始水平。@Facitious:我甚至记得自己做过实验-我用gnuplot制作了一个内存使用率图,如果我没记错的话,它总是在一段时间内得到更多,然后回落到大约开始值。不过,我的内存会随着时间的推移不断下降,直到我重新启动节点进程为止:(