¿Por qué este método imprime 4?

Me preguntaba qué pasaría cuando intentas atrapar un StackOverflowError y se te ocurrió el siguiente método:

class RandomNumberGenerator {

    static int cnt = 0;

    public static void main(String[] args) {
        try {
            main(args);
        } catch (StackOverflowError ignore) {
            System.out.println(cnt++);
        }
    }
}

Ahora mi pregunta:

¿Por qué este método imprime '4'?

Pensé que tal vez era porqueSystem.out.println() necesita 3 segmentos en la pila de llamadas, pero no sé de dónde proviene el número 3. Cuando miras el código fuente (y el código de bytes) deSystem.out.println(), normalmente llevaría a muchas más invocaciones de métodos que 3 (por lo que 3 segmentos en la pila de llamadas no serían suficientes). Si es debido a las optimizaciones que aplica la máquina virtual Hotspot (método en línea), me pregunto si el resultado sería diferente en otra máquina virtual.

Editar:

Como la salida parece ser muy específica de JVM, obtengo el resultado 4 usando
Java (TM) SE Runtime Environment (compilación 1.6.0_41-b02)
VM de servidor de 64 bits de Java HotSpot (TM) (compilación 20.14-b01, modo mixto)


Explicación de por qué creo que esta pregunta es diferente deEntendiendo la pila de Java:

Mi pregunta no es sobre por qué hay un cnt> 0 (obviamente porqueSystem.out.println() Requiere tamaño de pila y lanza otra.StackOverflowError antes de que se imprima algo), pero por qué tiene el valor particular de 4, respectivamente 0,3,8,55 o algo más en otros sistemas.

Respuestas a la pregunta(7)

Su respuesta a la pregunta