3.4.2 TECNICHE DI ESECUZIONE
Un'implementazione di JVM può utilizzare varie tecniche di esecuzione dei bytecodes --interpretando, con compilazione just in time, con ottimizzazione adattiva, esecuzione nativa -- finchè essa aderisce alla semantica del set di istruzioni della JVM.
- JIT (JUST IN TIME)
La JVM originaria interpretava i bytecodes uno alla volta. La seconda generazione ha aggiunto un compilatore JIT (just in time), che compila ogni metodo nel codice nativo alla prima esecuzione, quindi esegue il codice nativo. Dopodichè, quando il metodo è invocato, viene eseguito il codice nativo.
-OTTIMIZZAZIONE ADATTIVA
Gli ottimizzatori adattivi, si avvantaggiano di un'informazione disponibile solo a run-time, per tentare di combinare l'interpretazione di bytecodes e la compilazione in nativo nel modo che può portare alla performance ottimale.
Una virtual machine con ottimizzazione adattiva (es. SUN HOTSPOT virtual machine www.java.sun.com/products/hotspot ) inizia interpretando tutto il codice. Poiché molti programmi trascorrono dall'80 al 90% del loro tempo eseguendo il 10- 20% del codice, monitorando l'esecuzione del programma, la virtual machine può accorgersi di quali metodi rappresentano il cosiddetto "hot spot" e creare per essi una thread in background che compila i bytecodes in nativo e ottimizza il codice.
Nel frattempo, il programma può continuare a eseguire quel metodo interpretando i suoi bytecodes.
Poiché la virtual machine sta solo compilando e ottimizzando l'"hot spot" (il 10- 20 percento del codice) ossia il "codice critico nel tempo", impiega più tempo del JIT per realizzare le ottimizzazioni.
Una virtual machine ad ottimizzazione adattiva può mantenere i vecchi bytecodes alla sua portata, in caso che un metodo esca dall'hot spot. (L'hot spot si può spostare mentre il programma viene eseguito). Se un metodo si sposta dall'hot spot, la virtual machine può scartare il codice compilato e re-interpretare i bytecodes di quel metodo.
Un vantaggio dell'ottimizzazione adattiva rispetto alla statica è che, poiché avviene a runtime, essa può usare informazioni non disponibili a un compilatore statico. Ad esempio, perfino se ci potessero essere 30 possibili implementazioni che possono essere chiamate per una particolare invocazione di metodo, a run time forse solo due di questi saranno chiamati. L'ottimizzazione adattiva permette solo a questi due di essere incapsulati, minimizzando la grandezza del codice ottimizzato.