Jak głęboko muszę wejść do stosu wywołań, zanim otrzymam StackOverflowError? Czy platforma odpowiedzi jest zależna?
Jak głęboko muszę wejść do stosu wywołań, zanim otrzymam StackOverflowError? Czy platforma odpowiedzi jest zależna?
Odpowiedzi:
Zależy to od ilości pamięci wirtualnej przydzielonej do stosu.
http://www.odi.ch/weblog/posting.php?posting=411
Możesz to dostroić za pomocą -Xssparametru VM lub Thread(ThreadGroup, Runnable, String, long)konstruktora.
Testowałem na swoim systemie i nie znalazłem żadnej stałej wartości, czasami przepełnienie stosu występuje po 8900 wywołaniach, czasami tylko po 7700, losowych liczbach.
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(); } }może działać „wirtualnie” w nieskończoność, ale tylko w Javie.
StackOverflowErrorwystępuje po 8792
Rozmiar stosu można ustawić za pomocą -Xssprzełącznika wiersza poleceń, ale z reguły jest on wystarczająco duży, setki, jeśli nie tysiące połączeń. (Wartość domyślna zależy od platformy, ale na większości platform co najmniej 256 KB).
Jeśli otrzymasz przepełnienie stosu, w 99% przypadków jest to spowodowane błędem w kodzie.
Porównaj te dwa wywołania:
(1) Metoda statyczna:
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) Metoda niestatyczna wykorzystująca inną klasę:
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
Klasa testowa rekursji ma public int testRecursion(int number) {jako jedyną metodę.