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.

questionAnswers(7)

yourAnswerToTheQuestion