如何更改 NodeJS 中的堆栈大小限制?

jcu*_*bic 4 stack-overflow stack-size node.js

在我的库(JavaScript 中的方案)中,我有一个测试应该失败,因为它计算 (! 1000),并且在实现 TCO(尾调用优化)时应该通过。但最近 NodeJS 可能增加了堆栈大小限制,因为测试通过意味着它没有失败。

有没有办法让 NodeJS 中的堆栈大小更小?所以我不需要增加阶乘函数的值来溢出堆栈。

编辑:请注意,GitHub--stack-size上讨论的选项可能会使节点崩溃。我希望出现堆栈溢出错误,但值小于 1000。

Che*_*yDT 6

您可以使用--stack-sizeV8 选项(另请参阅此处)。

要查看默认大小,您可以检查--v8-options

$ node --v8-options | grep -B0 -A1 stack-size
  --stack-size (default size of stack region v8 is allowed to use (in kBytes))
        type: int  default: 984
Run Code Online (Sandbox Code Playgroud)

(除了调用和解析之外,我不知道有什么方法可以以编程方式读取默认值或当前值node --v8-options。)

然后,您可以使用该选项指定新的堆栈大小:

$ node --stack-size=512 index.js
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令从程序本身进行设置v8.setFlagsFromString

$ node --v8-options | grep -B0 -A1 stack-size
  --stack-size (default size of stack region v8 is allowed to use (in kBytes))
        type: int  default: 984
Run Code Online (Sandbox Code Playgroud)

请注意,在 Node.js 中使用的较新版本的 V8 中,可用的 V8 选项将来可能会发生变化。(例如,我相信这个选项stack_size以前是用下划线调用的,但现在是stack-size用破折号调用的。)如果该选项不再存在,您可以使用v8flagspackage包或以编程方式调用node --v8-options来引发错误,以便您可以调整测试。