Насколько глубоко мне нужно углубиться в стек вызовов, чтобы получить StackOverflowError? Зависит ли платформа ответа?
Насколько глубоко мне нужно углубиться в стек вызовов, чтобы получить StackOverflowError? Зависит ли платформа ответа?
Ответы:
Это зависит от объема виртуальной памяти, выделенной стеку.
http://www.odi.ch/weblog/posting.php?posting=411
Вы можете настроить это с помощью -Xssпараметра виртуальной машины или Thread(ThreadGroup, Runnable, String, long)конструктора.
Я тестировал свою систему и не нашел никакого постоянного значения, иногда переполнение стека происходит после 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();
}
}
public foo() { try { foo(); } finally { foo(); } }может работать «виртуально» вечно, но только в java.
StackOverflowErrorпроисходит после 8792
Размер стека можно установить с помощью -Xssпереключателя командной строки, но, как правило, он достаточно глубокий, сотни, если не тысячи вызовов. (Значение по умолчанию зависит от платформы, но не менее 256 КБ на большинстве платформ.)
Если вы получаете переполнение стека, в 99% случаев это вызвано ошибкой в коде.
Сравните эти два вызова:
(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) {единственный метод.