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