Quanto in profondità devo entrare nello stack di chiamate prima di ottenere StackOverflowError? La piattaforma di risposta dipende?
Quanto in profondità devo entrare nello stack di chiamate prima di ottenere StackOverflowError? La piattaforma di risposta dipende?
Risposte:
Dipende dalla quantità di memoria virtuale allocata allo stack.
http://www.odi.ch/weblog/posting.php?posting=411
Puoi ottimizzarlo con il -Xssparametro VM o con il Thread(ThreadGroup, Runnable, String, long)costruttore.
Ho eseguito il test sul mio sistema e non ho trovato alcun valore costante, a volte lo stack overflow si verifica dopo 8900 chiamate, a volte solo dopo 7700, numeri casuali.
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(); } }può funzionare "virtualmente" per sempre, ma solo in Java.
StackOverflowErrorverifica dopo l'8792
La dimensione dello stack può essere impostata con -Xss interruttore della riga di comando ma, come regola generale, è abbastanza profonda, centinaia se non migliaia di chiamate. (L'impostazione predefinita dipende dalla piattaforma, ma almeno 256k nella maggior parte delle piattaforme.)
Se si verifica un overflow dello stack, il 99% delle volte è causato da un errore nel codice.
Confronta queste due chiamate:
(1) Metodo statico:
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) Metodo non statico che utilizza una classe diversa:
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
La classe di ricorsione test ha public int testRecursion(int number) {come unico metodo.