¿Cuál es la profundidad máxima de la stack de llamadas java?

¿Qué tan profundo debo entrar en la stack de llamadas antes de obtener un StackOverflowError? ¿La plataforma de respuesta es dependiente?

Depende de la cantidad de memoria virtual asignada a la stack.

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) .

Probé en mi sistema y no encontré ningún valor constante, a veces el desbordamiento de stack 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(); } } 

El tamaño de la stack 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 stack, el 99% del tiempo 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 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.