为什么在热循环中写入 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," 更微妙。我想它正在阻塞地写入一个非阻塞地写入的缓冲区,但不确定。 (认为此答案不完整。)
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," 更微妙。我想它正在阻塞地写入一个非阻塞地写入的缓冲区,但不确定。 (认为此答案不完整。)