Qual é a profundidade máxima da pilha de chamadas java?

Quão fundo preciso ir para a pilha de chamadas antes de obter um StackOverflowError? A plataforma de resposta é dependente?

Depende da quantidade de memory virtual alocada para a pilha.

http://www.odi.ch/weblog/posting.php?posting=411

Você pode ajustar isso com o parâmetro -Xss VM ou com o Thread(ThreadGroup, Runnable, String, long) .

Eu testei no meu sistema e não encontrei nenhum valor constante, às vezes estouro de pilha ocorre após 8900 chamadas, às vezes só após 7700, números randoms.

 public class MainClass { private static long depth=0L; public static void main(String[] args){ deep(); } private static void deep(){ System.err.println(++depth); deep(); } } 

O tamanho da pilha pode ser definido com o -Xss linha de comando -Xss mas, como regra geral, é profundo o suficiente, centenas, se não milhares, de chamadas. (O padrão é dependente da plataforma, mas pelo menos 256k na maioria das plataformas.)

Se você receber um estouro de pilha, 99% do tempo será causado por um erro no código.

Compare estas duas chamadas:
(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 não estático usando uma class 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 

A class de recursion de teste tem public int testRecursion(int number) { como o único método.