Java Language
Compilatore Just in Time (JIT)
Ricerca…
Osservazioni
Storia
Il compilatore Symantec JIT era disponibile in Sun Java dalla 1.1.5 in poi, ma aveva problemi.
Il compilatore Hotspot JIT è stato aggiunto a Sun Java in 1.2.2 come plug-in. In Java 1.3, JIT era abilitato per impostazione predefinita.
Panoramica
Il compilatore JIT (Just-In-Time) è un componente di Java ™ Runtime Environment che migliora le prestazioni delle applicazioni Java in fase di esecuzione.
- I programmi Java sono costituiti da classi, che contengono bytecode neutrali alla piattaforma che possono essere interpretati da una JVM su molte architetture di computer differenti.
- In fase di esecuzione, la JVM carica i file di classe, determina la semantica di ogni singolo bytecode ed esegue il calcolo appropriato.
L'utilizzo aggiuntivo del processore e della memoria durante l'interpretazione significa che un'applicazione Java ha prestazioni più lente rispetto a un'applicazione nativa.
Il compilatore JIT aiuta a migliorare le prestazioni dei programmi Java compilando bytecode nel codice macchina nativo in fase di esecuzione.
Il compilatore JIT è abilitato per impostazione predefinita e viene attivato quando viene chiamato un metodo Java. Il compilatore JIT compila i bytecode di quel metodo nel codice macchina nativo, compilandolo "just in time"
per l'esecuzione.
Quando un metodo è stato compilato, la JVM chiama direttamente il codice compilato di quel metodo invece di interpretarlo. Teoricamente, se la compilazione non richiedesse tempo di processore e utilizzo della memoria, la compilazione di ogni metodo potrebbe consentire alla velocità del programma Java di avvicinarsi a quella di un'applicazione nativa.
La compilazione JIT richiede tempo di processore e utilizzo della memoria. Quando la JVM si avvia per la prima volta, vengono chiamati migliaia di metodi. La compilazione di tutti questi metodi può influire in modo significativo sui tempi di avvio, anche se il programma raggiunge prestazioni di picco molto buone.
- In pratica, i metodi non vengono compilati la prima volta che vengono chiamati. Per ogni metodo, la JVM mantiene un
call count
che viene incrementato ogni volta che viene chiamato il metodo. - La JVM interpreta un metodo fino a quando il conteggio delle chiamate supera una soglia di compilazione JIT.
- Pertanto, i metodi utilizzati più spesso vengono compilati subito dopo l'avvio della JVM e i metodi meno utilizzati vengono compilati molto più tardi, o per niente.
- La soglia di compilazione JIT aiuta JVM ad avviarsi rapidamente e a migliorare le prestazioni.
- La soglia è stata accuratamente selezionata per ottenere un equilibrio ottimale tra i tempi di avvio e le prestazioni a lungo termine.
- Dopo che un metodo è stato compilato, il conteggio delle chiamate viene azzerato e le chiamate successive al metodo continuano ad incrementare il conteggio.
- Quando il conteggio chiamate di un metodo raggiunge una soglia di ricompilazione JIT, il compilatore JIT lo compila una seconda volta, applicando una selezione più ampia di ottimizzazioni rispetto alla compilazione precedente.
- Questo processo viene ripetuto fino al raggiungimento del livello massimo di ottimizzazione.
I metodi più impegnativi di un programma Java sono sempre ottimizzati in modo più aggressivo, massimizzando i vantaggi prestazionali dell'uso del compilatore JIT.
Il compilatore JIT può anche misurare i operational data at run time
e utilizzare tali dati per migliorare la qualità di ulteriori ricompilazioni.
Il compilatore JIT può essere disabilitato, nel qual caso verrà interpretato l'intero programma Java. La disabilitazione del compilatore JIT non è consigliata eccetto per diagnosticare o aggirare i problemi di compilazione JIT.