Wie tief muss ich in den Aufrufstapel gehen, bevor ich einen StackOverflowError erhalte? Ist die Antwortplattform abhängig?
Wie tief muss ich in den Aufrufstapel gehen, bevor ich einen StackOverflowError erhalte? Ist die Antwortplattform abhängig?
Antworten:
Dies hängt von der Menge des dem Stapel zugewiesenen virtuellen Speichers ab.
http://www.odi.ch/weblog/posting.php?posting=411
Sie können dies mit dem -XssVM-Parameter oder mit dem Thread(ThreadGroup, Runnable, String, long)Konstruktor optimieren .
Ich habe auf meinem System getestet und keinen konstanten Wert gefunden. Manchmal tritt ein Stapelüberlauf nach 8900 Aufrufen auf, manchmal erst nach 7700 Zufallszahlen.
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(); } }kann "praktisch" für immer laufen, allerdings nur in Java.
StackOverflowErrortritt nach nach 8792
Die Stapelgröße kann mit dem -XssBefehlszeilenschalter festgelegt werden. Als Faustregel gilt jedoch, dass sie tief genug ist, Hunderte, wenn nicht Tausende von Aufrufen. (Die Standardeinstellung ist plattformabhängig, auf den meisten Plattformen jedoch mindestens 256 KB.)
Wenn Sie einen Stapelüberlauf erhalten, wird dieser in 99% der Fälle durch einen Fehler im Code verursacht.
Vergleichen Sie diese beiden Aufrufe:
(1) Statische Methode:
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) Nicht statische Methode unter Verwendung einer anderen Klasse:
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
Die Testrekursionsklasse ist public int testRecursion(int number) {die einzige Methode.