descargar - java offline
¿Cuál es la profundidad máxima de la pila de llamadas java? (4)
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 utilizando 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 recursión de prueba tiene public int testRecursion(int number) {
como el único método.
¿Qué tan profundo debo entrar en la pila de llamadas antes de obtener un StackOverflowError? ¿La plataforma de respuesta es dependiente?
Depende de la cantidad de memoria virtual asignada a la pila.
http://www.odi.ch/weblog/posting.php?posting=411
Puede sintonizar esto con el parámetro -Xss
VM o con el Thread(ThreadGroup, Runnable, String, long)
.
El tamaño de la pila se puede establecer con el -Xss
línea de comandos -Xss
pero, como regla general, es lo suficientemente profundo, cientos o miles de llamadas en profundidad. (El valor predeterminado depende de la plataforma, pero al menos 256k en la mayoría de las plataformas).
Si obtienes un desbordamiento de la pila, el 99% del tiempo es causado por un error en el código.
Probé en mi sistema y no encontré ningún valor constante, a veces el desbordamiento de pila ocurre después de las llamadas 8900, 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();
}
}