Mi chiedevo cosa succede quando provi a catturare un StackOverflowError e hai trovato il seguente metodo:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
Ora la mia domanda:
Perché questo metodo stampa "4"?
Ho pensato che forse fosse perché ha System.out.println()
bisogno di 3 segmenti nello stack di chiamate, ma non so da dove viene il numero 3. Quando guardi il codice sorgente (e il bytecode) di System.out.println()
, normalmente porterebbe a molte più chiamate di metodo di 3 (quindi 3 segmenti sullo stack di chiamate non sarebbero sufficienti). Se è a causa delle ottimizzazioni applicate dalla VM Hotspot (metodo inlining), mi chiedo se il risultato sarebbe diverso su un'altra VM.
Modifica :
Poiché l'output sembra essere altamente specifico per JVM, ottengo il risultato 4 utilizzando
Java (TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot (TM) VM server a 64 bit (build 20.14-b01, modalità mista)
Spiegazione del motivo per cui penso che questa domanda sia diversa dalla comprensione dello stack Java :
La mia domanda non riguarda il motivo per cui c'è un cnt> 0 (ovviamente perché System.out.println()
richiede la dimensione dello stack e ne lancia un altro StackOverflowError
prima che qualcosa venga stampato), ma perché ha il valore particolare di 4, rispettivamente 0,3,8,55 o qualcos'altro su altro sistemi.
5
, 6
e 38
con Java 1.7.0_10