Java堆栈溢出错误 – 如何增加Eclipse的堆栈大小?

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

Exception in thread "main" java.lang.StackOverflowError 

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

更新:

@Jon Skeet

代码recursion遍历一个分析树,以build立一个数据结构。 所以,例如,代码将使用分析树中的一个节点做一些工作,并在节点的两个子节点上调用它自己,结合它们的结果给出树的总体结果。

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

另外我敢肯定,代码不会因为一个错误,因为它适用于小input。

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

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

通过增加堆栈大小可能是可以治愈的,但更好的解决办法是制定如何避免recursion这么多。 recursion解决scheme总是可以转换为迭代解决scheme – 这将使您的代码更加干净地扩展到更大的input。 否则,你真的会猜测提供了多less堆栈,这可能不是从input中显而易见的。

顺便说一句,您是否确定这是因为input大小而不是代码中的错误? 这个recursion有多深?

编辑:好吧,看到更新,我个人会尝试重写它,以避免使用recursion。 一般来说,“事情仍然有效”的Stack<T>是移除recursion的一个很好的起点。

在VM参数中添加标志-Xss1024k

例如,您也可以使用-Xss1m来增加mb的堆栈大小。

在使用XSOM库parsing模式定义文件(XSD)时,我也遇到同样的问题,

我能够增加堆栈内存高达208Mb,然后显示heap_out_of_memory_error我只能增加到320MB。

最后的configuration是-Xmx320m -Xss208m但是又跑了一段时间,失败了。

我的函数recursion地打印模式定义的整个树,令人惊讶的是输出文件跨越了820Mb的一个4Mb的定义文件(Aixm库),而这个文件又使用了50Mb的模式定义库(ISO gml)。

与此我相信我必须避免recursion,然后开始迭代和其他表示输出的方式,但我没有什么麻烦转换所有recursion迭代。

您需要在Eclipse内部具有启动configuration,以便调整JVM参数。

使用F11或Ctrl-F11运行程序后,在Run – > Run Configurations中打开启动configuration,然后在“Java Applications”下打开程序。 selectArguments窗格,您将在其中find“VM参数”。

这是-Xss1024k去的地方。

如果您希望启动configuration成为工作区中的文件(因此您可以右键单击并运行它),请select“公用”窗格,然后选中另存为 – >共享文件checkbox,然后浏览到您想要启动文件的位置。 我通常把它们放在一个单独的文件夹中,因为我们将它们检入到CVS中。

当参数-Xss不能完成这个工作时,尝试从以下位置删除临时文件:

 c:\Users\{user}\AppData\Local\Temp\. 

这为我做了诡计。

查看Morris按顺序遍历树,使用常量空间并运行在O(n)(最多比普通recursion遍历长3倍 – 但是在空间上节省很多)。 如果节点是可修改的,则可以在回溯到其根目录时(通过直接写入节点)保存子树的计算结果。