jdk descargar java

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?



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(); } }