我的JavaScript代码引发致命错误:堆限制附近的标记无效无效分配失败-JavaScript堆内存不足

时间:2019-09-24 09:23:32

标签: javascript node.js

我正在运行以下代码

var i = 0;
while (i != i + 1) {
    console.log(++i)
}

据我了解,我只使用一个变量,因此该程序永远不会耗尽内存(不是很长时间),但是几分钟后,它将引发错误。

任何人都可以帮助我了解为什么它会以这种方式运行

2 个答案:

答案 0 :(得分:1)

这是由于console.log调用。流的垃圾回收不会立即激活。 运行以下命令不会导致任何内存问题。当然,由于数字的大小,它最终将崩溃。但这会花费更长的时间。

var i = 0; while (i != i + 1) { i++; }

有关使用console.log进行内存管理的更多信息:https://github.com/nodejs/help/issues/1339

答案 1 :(得分:1)

控制台的内容肯定保存在某个地方,并且随着代码的增长一直在增长。无限长的(*)文本不适合存储,仅此而已。

此外,console.log()可能会分配多个字符串并为每个调用点燃一个正则表达式引擎。垃圾收集可能跟不上这个。在JavaScript方面,它已经不是一个简单的功能:https://github.com/nodejs/node/blob/master/lib/internal/console/constructor.js#L214

Console.prototype[kWriteToConsole] = function(streamSymbol, string) {
  [...]

  if (groupIndent.length !== 0) {
    if (string.includes('\n')) {
      string = string.replace(/\n/g, `\n${groupIndent}`);
    }
    string = groupIndent + string;
  }
  string += '\n';

  if (ignoreErrors === false) return stream.write(string);

  // and a similar one with extra steps for catching errors
  [...]
};

在流方面和本机部分也可能有额外的步骤。


(*)好吧,您的文本不会无限增长 ,但是会有 2 ^ 52 2 ^ 53个调用,这比4.5 peta < / em>通话(peta = 10 ^ 15,1000000 * giga)。如果它们每个仅消耗1位,那么对于您的计算机来说已经太高了。