为什么在热循环中写入 stdout 会导致内存不足关闭?

Why does writing to stdout in a hot loop cause an out of memory shutdown?

for (i = 0; i < 3e11; i++) {
   process.stdout.write('aaaabbbbccccdddd') 
   process.stdout.write('\n') 
}

或此代码:

for (i = 0; i < 3e11; i++) {
   console.log('aaaabbbbccccdddd') 
}

只需 运行 在这样的终端中:node test.js

大约一分钟后产生这个:

<--- JS stacktrace --->
Cannot get stack trace in GC.
FATAL ERROR: MarkCompactCollector: semi-space copy, fallback in old gen Allocation failed - JavaScript heap out of memory
Aborted (core dumped)

它在哪里吃内存?

$ node -v
v6.1.0

它包含在这个错误中:https://github.com/nodejs/node/issues/1741

它被认为是 node.js 中的一个未解决的错误。它似乎与 stdout 的异步 属性 有关,可以通过以下方式修复:

process.stdout._handle.setBlocking(true);

我真的很困惑,因为我知道 console.log 被阻止了。这个问题可能比 "blocking" v. "not blocking," 更微妙。我想它正在阻塞地写入一个非阻塞地写入的缓冲区,但不确定。 (认为​​此答案不完整。)