Por que esse método imprime 4?
Eu queria saber o que acontece quando você tenta pegar um StackOverflowError e surgiu com o seguinte método:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
Agora minha pergunta:
Por que esse método imprime '4'?
Eu pensei que talvez fosse porqueSystem.out.println()
precisa de 3 segmentos na pilha de chamadas, mas não sei de onde vem o número 3. Quando você olha para o código-fonte (e bytecode) deSystem.out.println()
, normalmente levaria a muito mais invocações de método do que 3 (portanto, 3 segmentos na pilha de chamadas não seriam suficientes). Se é por causa das otimizações que a VM do Hotspot se aplica (método inline), gostaria de saber se o resultado seria diferente em outra VM.
Editar:
Como a saída parece ser altamente específica da JVM, recebo o resultado 4 usando
Java Runtime Environment (TM) SE (build 1.6.0_41-b02)
Java HotSpot (TM) VM de servidor de 64 bits (compilação 20.14-b01, modo misto)
Explicação porque eu acho que esta questão é diferente deEntendendo a pilha Java:
Minha pergunta não é sobre por que há um cnt> 0 (obviamente porqueSystem.out.println()
requer tamanho de pilha e lança outroStackOverflowError
antes que algo seja impresso), mas por que ele tem o valor particular de 4, respectivamente 0,3,8,55 ou outra coisa em outros sistemas.