java调用堆栈的最大深度是多少?

时间:2011-01-19 10:24:16

标签: java

在得到StackOverflowError之前,我需要多深入调用堆栈?答案平台是否依赖?

4 个答案:

答案 0 :(得分:55)

这取决于分配给堆栈的虚拟内存量。

http://www.odi.ch/weblog/posting.php?posting=411

您可以使用-Xss VM参数或Thread(ThreadGroup, Runnable, String, long)构造函数对此进行调整。

答案 1 :(得分:24)

我在我的系统上测试过并没有找到任何常量值,有时在8900次调用后发生堆栈溢出,有时仅在7700次后随机数字。

public class MainClass {

    private static long depth=0L;

    public static void main(String[] args){
        deep(); 
    }

    private static void deep(){
        System.err.println(++depth);
        deep();
    }

}

答案 2 :(得分:19)

可以使用-Xss命令行开关设置堆栈大小,但根据经验,它足够深,数百甚至数千个调用深度。 (默认值取决于平台,但在大多数平台上至少为256k。)

如果堆栈溢出,99%的时间是由代码中的错误引起的。

答案 3 :(得分:3)

比较这两个电话:
(1)静态方法:

RowDefinition

(2)使用不同类的非静态方法:

public static void main(String[] args) {
    int i = 14400; 
    while(true){   
        int myResult = testRecursion(i);
        System.out.println(myResult);
        i++;
    }
}

public static int testRecursion(int number) {
    if (number == 1) {
        return 1;
    } else {
        int result = 1 + testRecursion(number - 1);
        return result;
    }    
}
 //Exception in thread "main" java.lang.StackOverflowError after 62844

测试递归类有public static void main(String[] args) { int i = 14400; while(true){ TestRecursion tr = new TestRecursion (); int myResult = tr.testRecursion(i); System.out.println(myResult); i++; } } //Exception in thread "main" java.lang.StackOverflowError after 14002 作为唯一的方法。