Подтвердить что ты не робот

Какова максимальная глубина стека вызовов java?

Насколько глубоко мне нужно идти в стек вызовов, прежде чем я получу StackOverflowError? Является ли зависимая платформа ответа?

4b9b3361

Ответ 2

Я тестировал свою систему и не нашел постоянного значения, иногда переполнение стека происходит после 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();
    }

}

Ответ 3

Размер стека может быть задан с помощью командной строки -Xss, но, как правило, он достаточно глубок, сотни, если не тысячи вызовов. (Значение по умолчанию зависит от платформы, но не менее 256 тыс. На большинстве платформ.)

Если вы получаете переполнение стека, 99% времени, вызванного ошибкой в ​​коде.

Ответ 4

Сравните эти два вызова:
(1) Статический метод:

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

(2) Нестатический метод с использованием другого класса:

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

Класс тестовой рекурсии имеет public int testRecursion(int number) { как единственный метод.