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倍 – 但是在空间上节省很多)。 如果节点是可修改的,则可以在回溯到其根目录时(通过直接写入节点)保存子树的计算结果。
- 本地主机上的Tomcat服务器所需的几个端口(8005,8080,8009)已经在使用中
- 无法执行dex:多个dex文件定义Lcom / myapp / R $数组;
- 安装Mac OS X Yosemite后,Eclipse将无法启动(Mac OS 10.10)
- 重命名R.java生成的包
- 是否有修改eclipse中的键盘快捷键?
- 在不使用Maven的情况下在Eclipse中创build一个src / main / java文件夹结构
- 是否有可能在java eclipsedebugging器中“回头”,就像拖动VS中的箭头一样
- Eclipse的组织导入(ctrl + shift + o)命令的静态导入处理可以修改吗?
- 如何将Java API文档添加到Eclipse?