1

我有一个递归函数,适用于调用堆栈深度高达 1000 的输入,但对于更大的输入则失败。我将该函数转换为尾递归函数,使其可以达到 1350 左右。

有什么限制,有什么办法可以增加这个限制?

我正在使用纯函数,并希望避免使用操作。我有一个解决方案,可以将问题分解为多个步骤的组合,每个步骤的堆栈深度都较小,但这是相当人为的,因为它的唯一目的是避免问题,而且它更复杂。

4

4 回答 4

2

这又是我的错误……Java 堆栈的设置是-Xss(-Xms 设置是起始堆大小),抱歉。因此,如果您使用启动器的 Debugger 选项卡中的 JVM Arguments 部分,并设置类似 -Xss5m 的内容,您应该会走得更远。

在一个使用递归函数的简单实验中,默认堆栈允许我进行 227 次调用的深度。使用 -Xss5m 给了我 4020 个调用,而 -Xss10m 给了我 8050 个调用。请注意,这些堆栈大小比您尝试的 Gb 大小要小一些 - 5Mb 的堆栈是很多调用!

于 2016-02-19T11:49:05.677 回答
1

听起来您在询问如何在 Overture 调试器中而不是在 Overture IDE (overture.ini) 中增加 Java 堆栈限制。

要更改将附加参数传递给 Overture 调试器,您需要将它们添加到启动配置中:

  1. 打开启动配置
  2. 选择“调试器”选项卡
  3. 将您的参数添加到顶部“参数:”旁边显示的框中

Overture 启动配置

于 2016-02-16T10:12:56.963 回答
1

Overture 不会对底层 Java 堆栈限制施加堆栈限制,因此它只会尊重 -Xms JVM 参数。我认为解释器的常规执行堆栈来自 Overture.ini 文件(顶层),您可以在其中看到 -Xmx 参数来设置最大堆。您可以尝试添加(比如说)-Xms128m,或者您选择的大小,看看这是否能让您走得更远?

于 2016-02-15T09:32:21.907 回答
0

我尝试将 -Xms 和 -Xmx 都设置为 2048m,但没有任何影响。我还在 Mac OSX 和 Windows 10 上尝试过 Overture 2.3.0,结果相同。

为了使我的项目脱离循环,我创建了一个具有一个非常简单的功能的新项目:

  countdown(n:nat) res:nat
  == if n=0 then n else countdown(n-1)

在 Windows 和 Mac 上,我可以使用值 807 调用它并成功,而使用 808 则失败并出现错误:

internal error

Main 206: Error evaluating code
Detailed Message: internal error
于 2016-02-16T08:57:48.300 回答