node.js文件内存泄漏?
我看到一个内存泄漏,下面的代码:
while (true) { console.log("Testing."); }
我已经尝试过定义string,只是使用一个常量,但它泄漏内存,仍然:
var test = "Testing."; while (true) { console.log(test); }
如果我使用文件而不是标准日志,则发生相同的泄漏:
var test = "Testing."; var fh = fs.createWriteStream("test.out", {flags: "a"}); while (true) { fh.write(test); }
我想也许是因为我没有正确closures文件,但我试过这个,仍然看到了泄漏:
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
技巧中:写入是asynchronous的,如果控制台/文件/任何比节点慢的节点,节点都会无限地缓冲数据,直到输出再次释放为止。 为了避免这种情况,在编写一些东西之后,你必须听取drain
事件 – 它告诉你什么时候pipe道再次空闲。 请参阅: http : //nodejs.org/docs/latest/api/streams.html#event_drain_