Насколько глубоко мне нужно идти в стек вызовов, прежде чем я получу StackOverflowError? Является ли зависимая платформа ответа?
Какова максимальная глубина стека вызовов java?
Ответ 1
Это зависит от объема виртуальной памяти, выделенной стеку.
http://www.odi.ch/weblog/posting.php?posting=411
Вы можете настроить это с помощью параметра -Xss
VM или с помощью конструктора Thread(ThreadGroup, Runnable, String, long)
.
Ответ 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) {
как единственный метод.