Java堆栈溢出错误 - 如何在Eclipse中增加堆栈大小?

我正在运行一个我在Eclipse中用Java编写的程序。对于非常大的输入,该程序具有非常深的递归级别。对于较小的输入,程序运行良好,但是当给出较大的输入时,我得到以下错误:

Exception in thread "main" java.lang.StackOverflowError

这可以通过增加Java堆栈大小来解决吗?如果是这样,我该如何在Eclipse中做到这一点?

更新:

@Jon 斯基特

代码以递归方式遍历解析树,以便构建数据结构。因此,例如,代码将使用解析树中的节点执行一些工作,并在节点的两个子节点上调用自身,合并其结果以提供树的整体结果。

递归的总深度取决于解析树的大小,但是当递归调用数达到 1000 时,代码似乎会失败(没有更大的堆栈)。

另外,我很确定代码不会因为错误而失败,因为它适用于小输入。


答案 1

打开应用程序的“运行配置”(“运行/运行配置...”,然后在“Java 应用程序”中查找应用程序条目)。

参数选项卡有一个文本框 Vm 参数,请输入(或更大的参数表示最大堆栈大小)。默认值为 512 kByte(SUN JDK 1.5 - 不知道它是否因供应商和版本而异)。-Xss1m


答案 2

可以通过增加堆栈大小来治愈 - 但更好的解决方案是找出如何避免如此频繁地递归。递归解决方案始终可以转换为迭代解决方案 - 这将使您的代码更清晰地扩展到更大的输入。否则,您将真正猜测要提供多少堆栈,这甚至可能从输入中看不出来。

顺便说一句,您是否绝对确定由于输入的大小而不是代码中的错误而失败?这种递归到底有多深?

编辑:好的,在看到更新后,我个人会尝试重写它以避免使用递归。通常,拥有“仍在做的事情”是消除递归的良好起点。Stack<T>


推荐