Java Virtual Machine - Livelli di compilazione
JVM supporta cinque livelli di compilazione:
- Interpreter
- C1 con ottimizzazione completa (senza profilazione)
- C1 con invocazione e contatori back-edge (profilazione leggera)
- C1 con profilatura completa
- C2 (utilizza i dati di profilazione dei passaggi precedenti)
Usa -Xint se vuoi disabilitare tutti i compilatori JIT e usa solo l'interprete.
Client vs server JIT
Usa -client e -server per attivare le rispettive modalità.
Il compilatore client (C1) inizia a compilare il codice prima del compilatore server (C2). Quindi, nel momento in cui C2 ha iniziato la compilazione, C1 avrebbe già compilato sezioni di codice.
Ma mentre attende, C2 profila il codice per saperne di più rispetto a C1. Quindi, il tempo che attende se compensato dalle ottimizzazioni può essere utilizzato per generare un binario molto più veloce. Dal punto di vista di un utente, il compromesso è tra l'ora di avvio del programma e il tempo impiegato per l'esecuzione del programma. Se il tempo di avvio è il premio, è necessario utilizzare C1. Se si prevede che l'applicazione venga eseguita per un lungo periodo di tempo (tipico delle applicazioni distribuite sui server), è meglio utilizzare C2 poiché genera codice molto più veloce che compensa notevolmente qualsiasi tempo di avvio aggiuntivo.
Per programmi come IDE (NetBeans, Eclipse) e altri programmi GUI, il tempo di avvio è fondamentale. NetBeans potrebbe impiegare un minuto o più per avviarsi. Centinaia di classi vengono compilate all'avvio di programmi come NetBeans. In questi casi, il compilatore C1 è la scelta migliore.
Nota che ci sono due versioni di C1: 32b and 64b. C2 entra solo in64b.
Compilazione a più livelli
Nelle versioni precedenti su Java, l'utente avrebbe potuto selezionare una delle seguenti opzioni:
- Interprete (-Xint)
- C1 (-client)
- C2 (-server)
È arrivato in Java 7. Utilizza il compilatore C1 per l'avvio e, quando il codice si surriscalda, passa a C2. Può essere attivato con le seguenti opzioni JVM: -XX: + TieredCompilation. Il valore predefinito èset to false in Java 7, and to true in Java 8.
Dei cinque livelli di compilazione, utilizza la compilazione a più livelli 1 -> 4 -> 5.