Me preguntaba qué sucede cuando intentas detectar 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 porque System.out.println()
necesita 3 segmentos en la pila de llamadas, pero no sé de dónde viene el número 3. Cuando observa el código fuente (y el código de bytes) de System.out.println()
, normalmente daría lugar 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 de Hotspot (inserción de métodos), 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)
Java HotSpot (TM) 64-Bit Server VM (compilación 20.14-b01, modo mixto)
Explicación por qué creo que esta pregunta es diferente de Comprender la pila de Java :
Mi pregunta no es por qué hay un cnt> 0 (obviamente porque System.out.println()
requiere un tamaño de pila y arroja otro StackOverflowError
antes de que se imprima algo), sino por qué tiene el valor particular de 4, respectivamente 0,3,8,55 o algo más en otro sistemas.
5
, 6
y 38
con Java 1.7.0_10