¿Qué tan profundo necesito entrar en la pila de llamadas antes de obtener un StackOverflowError? ¿Depende la plataforma de respuesta?
¿Qué tan profundo necesito entrar en la pila de llamadas antes de obtener un StackOverflowError? ¿Depende la plataforma de respuesta?
Respuestas:
Depende de la cantidad de memoria virtual asignada a la pila.
http://www.odi.ch/weblog/posting.php?posting=411
Puede ajustar esto con el -Xssparámetro VM o con el Thread(ThreadGroup, Runnable, String, long)constructor.
Probé en mi sistema y no encontré ningún valor constante, a veces se produce un desbordamiento de pila después de 8900 llamadas, a veces solo después de 7700, números aleatorios.
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(); } }puede ejecutarse 'virtualmente' para siempre, aunque solo en Java.
StackOverflowErrorocurre después de 8792
El tamaño de la pila se puede configurar con el -Xssinterruptor de la línea de comando, pero como regla general, es lo suficientemente profundo, cientos, si no miles, de llamadas. (El valor predeterminado depende de la plataforma, pero al menos 256k en la mayoría de las plataformas).
Si obtiene un desbordamiento de pila, el 99% de las veces es causado por un error en el código.
Compare estas dos llamadas:
(1) Método estático:
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) Método no estático con una clase diferente:
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 clase de recursividad de prueba tiene public int testRecursion(int number) {como único método.