如何处理以java.lang.StackOverflowError结尾的深度递归

时间:2012-08-09 09:19:49

标签: java stack-overflow

我得到了一个带有真正深度递归的程序,我确定它没有无限循环。但是在很短的时间(1s)后我得到了

java.lang.StackOverflowError

是否有可能增加他试图结束程序的时间?如果可能的话,我想跑几个小时; - )

3 个答案:

答案 0 :(得分:3)

听起来你有一个错误。您可以使用-Xss增加堆大小,但听起来您希望将其增加到远大于计算机的大小。

我建议你减少你正在使用的递归量,所以如果可能的话,它只下降几十个级别。

答案 1 :(得分:0)

this discussion中所述,您可以执行以下操作:

  • 使用运行时选项扩展堆栈大小(java -Xssjava -Xoss选项)
  • 使用优化编译器来减少每层(example given
  • 的堆栈开销

此外,您可以在JDK版本的Java.exe上尝试-server选项,因为它处理的方式有点不同。

但是,听起来你可能会问得太多,需要为你正在做的事情找到一种不同的方法。

答案 2 :(得分:0)

进一步关于减少递归/改变为迭代模式的评论,并且示例可能是有用的。如果我们以阶乘函数为例,它可以递归地(通常是)写成:

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;

}

可能值得做一些类似于你的代码的事情,以避免递归(这可能是你的错误的原因),因为它(几乎?)总是可以进行递归迭代