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

tre*_*ker 59 java eclipse stack-overflow jvm jvm-arguments

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

Exception in thread "main" java.lang.StackOverflowError
Run Code Online (Sandbox Code Playgroud)

可以通过增加Java堆栈大小来解决这个问题,如果是这样,我该如何在Eclipse中执行此操作?

更新:

@Jon Skeet

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

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

此外,我很确定代码没有失败,因为它适用于小输入的bug.

And*_*s_D 80

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

参数选项卡中有一个文本框VM参数,输入-Xss1m(或最大堆栈大小更大参数).默认值为512 kByte(SUN JDK 1.5 - 不知道供应商和版本之间是否有所不同).

  • 请注意以下问题:http://bugs.sun.com/bugdatabase/view_bug.do?video_id = 6316197 (2认同)

Jon*_*eet 37

可以通过增加堆栈大小来解决- 但更好的解决方案是找出如何避免递归这么多.递归解决方案总是可以转换为迭代解决方案 - 这将使您的代码更加干净地扩展到更大的输入.否则你真的会猜测要提供多少堆栈,这在输入中可能甚至不明显.

顺便说一下,你是否完全确定输入的大小而不是代码中的错误?这次递归有多深?

编辑:好的,看到更新后,我会亲自尝试重写它以避免使用递归.通常有一些Stack<T>"仍然可以做的事情"是删除递归的一个很好的起点.

  • ..或尾递归. (4认同)
  • 基本上堆栈空间就像堆一样是内存.为什么使用堆更好?这取决于您的应用程序和解决问题的方式.在某些情况下,使用堆栈而不是堆来更有效地进行内存管理.在某些情况下,基于堆栈的算法更简洁; 例如解析器. (2认同)

Gor*_*don 10

-Xss1024k在VM Arguments中添加标志.

您还可以mb使用-Xss1m例如增加堆栈大小.


小智 5

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

我能够将堆栈内存增加到208Mb,然后显示heap_out_of_memory_error我只能增加到320mb.

最后的配置-Xmx320m -Xss208m但是又一次运行了一段时间而失败了.

我的函数以递归方式打印模式定义的整个树,令人惊讶的是输出文件越过820Mb,定义文件为4 Mb(Aixm库),后者又使用50 Mb的模式定义库(ISO gml).

因此,我确信我必须避免递归,然后开始迭代和其他一些表示输出的方式,但是我很难将所有递归转换为迭代.