JVM (Java Virtual Machine) agisce come un motore di esecuzione per eseguire le applicazioni Java. La JVM è quella che chiama effettivamente il metodo principale presente nel codice Java. La JVM fa parte del JRE (Java Runtime Environment).

Le applicazioni Java sono chiamate WORA (Write Once Run Anywhere). Questo significa che un programmatore può sviluppare il codice Java su un sistema e può aspettarsi che venga eseguito su qualsiasi altro sistema abilitato a Java senza alcuna modifica. Tutto questo è possibile grazie alla JVM.

Quando compiliamo un file .java, i file .class (contenenti codice byte) con gli stessi nomi di classe presenti nel file .java sono generati dal compilatore Java. Questo file .class va in vari passi quando lo eseguiamo. Questi passi insieme descrivono l’intera JVM.

1) Classloader

Classloader è un sottosistema della JVM che viene utilizzato per caricare i file di classe. Ogni volta che eseguiamo il programma java, esso viene caricato prima dal classloader. Ci sono tre classloader integrati in Java.

  1. Bootstrap ClassLoader: È il primo class loader, che è responsabile del caricamento dei file di classe da rt.jar chiamato anche runtime jar.
  2. Extension ClassLoader: È responsabile del caricamento dei file di classe aggiuntivi dalla cartella jre lib ext (jre/lib/ext).
  3. Application ClassLoader: Application class loader è quello che carica i file di classe dal jar specifico dell’applicazione. Questo non è altro che l’applicazione che avete creato. Una volta che il vostro programma java viene compilato, la JVM crea i file di classe. L’Application class loader carica questi file di classe nell’area di memoria.

Linking: Esegue la verifica, la preparazione e (opzionalmente) la risoluzione.

  1. Verifica: Assicura la correttezza del bytecode.
  2. Preparazione: La JVM alloca la memoria per le variabili di classe e la inizializza ai valori predefiniti.
  3. Risoluzione: È il processo di sostituzione dei riferimenti simbolici del tipo con riferimenti diretti.

Inizializzazione

In questa fase, tutte le variabili statiche sono assegnate con i loro valori definiti nel codice e nel blocco statico

2) Runtime Data Area

Il secondo componente principale nell’architettura JVM è la run time data area. Proprio come una macchina ha bisogno di una strada, o come un treno ha bisogno di un binario ferroviario per funzionare, allo stesso modo la JVM ha bisogno di un’area di memoria per memorizzare i file di classe ed eseguirli. Ci sono 5 tipi di area dati di memoria. Sono l’area del metodo, la memoria Heap, la memoria Stack, i registri PC e gli stack dei metodi nativi.

  1. Area del metodo: Tutti i dati della classe sono memorizzati in quest’area di memoria.
  2. Area heap: Tutti gli oggetti e le variabili di istanza sono memorizzati in quest’area di memoria.
  3. Area stack: Per ogni thread, la JVM crea uno stack di run-time che viene memorizzato qui.
  4. RegistroPC: Memorizza l’indirizzo dell’istruzione di esecuzione corrente di un thread.
  5. Stack del metodo nativo: Lo stack dei metodi nativi contiene informazioni sui metodi nativi.

3) Motore di esecuzione

Il motore di esecuzione esegue la .class (bytecode). Legge il codice byte riga per riga, usa i dati e le informazioni presenti in varie aree di memoria ed esegue le istruzioni. Può essere classificato in tre parti:-

  1. Interprete: Compila il bytecode riga per riga e poi lo esegue. Lo svantaggio qui è che quando un metodo è chiamato più volte, ogni volta è richiesta l’interpretazione.
  2. Compilatore Just-In-Time(JIT): È usato per aumentare l’efficienza dell’interprete. Compila l’intero bytecode e lo cambia in codice nativo, così ogni volta che l’interprete vede chiamate di metodi ripetute, JIT fornisce direttamente il codice nativo per quella parte, così la reinterpretazione non è richiesta, quindi l’efficienza è migliorata.
  3. Garbage Collector: Un oggetto non più utilizzato viene rimosso dal garbage collector.

Categorie: Articles

0 commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *