Наскільки глибоко мені потрібно зайти в стек викликів, перш ніж отримати StackOverflowError? Чи залежить платформа відповідей?
Наскільки глибоко мені потрібно зайти в стек викликів, перш ніж отримати StackOverflowError? Чи залежить платформа відповідей?
Відповіді:
Це залежить від кількості віртуальної пам’яті, виділеної на стек.
http://www.odi.ch/weblog/posting.php?posting=411
Ви можете налаштувати це за допомогою -Xssпараметра VM або за допомогою 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відбувається після
Розмір стека можна встановити за -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) {єдиним методом.