【问题标题】:Why does writing to stdout in a hot loop cause an out of memory shutdown?为什么在热循环中写入标准输出会导致内存不足关闭?
【发布时间】:2016-06-28 20:30:43
【问题描述】:
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

【问题讨论】:

  • 如果一个进程正在写入标准输出,但没有人在听,它真的会占用内存吗?换句话说:这段代码在什么上下文中运行?
  • @CodeCaster 这只是在终端中运行。
  • 对我来说效果很好(持续 15 秒并计数)。
  • 你的节点版本是多少?
  • 是的,我也崩溃了。我认为这是一个有点操作系统级别的问题,可能输出进入缓冲区并保持在缓冲区中的速度比写入终端的速度要快,直到 OOM。

标签: node.js operating-system out-of-memory stdout


【解决方案1】:

此错误已涵盖:https://github.com/nodejs/node/issues/1741

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

process.stdout._handle.setBlocking(true);

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

【讨论】:

  • 只是好奇,具体是怎么找到的?
  • @exebook 一,我让你的问题标题更具体。二,一旦我意识到这是一个更具体的问题,我就用谷歌搜索了问题的标题。这就是为什么提出好的、具体的问题是值得的:P
猜你喜欢
  • 2017-09-08
  • 2018-10-25
  • 2013-04-30
  • 2021-01-07
  • 2013-11-06
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多