我得到了一个具有非常深的递归的程序,我确信它没有无限循环。但是在短时间(1s)之后,我得到了
java.lang.StackOverflowError
是否有可能增加他尝试结束程序的时间?如果可能的话,我想运行几个小时;-)
听起来你有一个错误。您可以使用-Xss
增加堆大小,但听起来您希望将其增加到比计算机大小大得多。
我建议你减少你正在使用的递归量,这样如果可能的话,它只下降几十个级别。
进一步讨论减少递归/更改为迭代模式的评论,示例可能很有用。如果我们以阶乘函数为例,它可以递归地(并且通常是)这样写:
int recurse(int n){
if(n = 0) return 1;
else return n*recurse(n-1);
}
但是,它可以像这样迭代完成(因此避免为大 n 产生堆栈溢出)
int iterate(int n){
int ans = 1;
for(int i = n; i > 0; i--){
ans *= i;
}
return ans;
}
可能值得做一些类似于你的代码的事情来避免递归(这可能是你的错误的原因),因为它(几乎?)总是可以使递归迭代
如本讨论中所述,您可以执行以下操作:
- 使用运行时选项(
java -Xss
和java -Xoss
选项)扩展堆栈的大小 - 使用优化编译器来减少每一层的堆栈开销(给出的示例)
此外,您可以在 Java.exe 的 JDK 版本上尝试 -server 选项,因为它处理事情的方式略有不同。
但是,听起来您可能要求太多,需要为您正在做的事情找到不同的方法。