Che cos’è la JVM?
Java Virtual Machine (JVM) è un motore che fornisce un ambiente runtime per guidare il codice o le applicazioni Java. Converte il bytecode Java in linguaggio macchina. JVM è una parte di Java Run Environment (JRE). In altri linguaggi di programmazione, il compilatore produce codice macchina per un particolare sistema. Tuttavia, il compilatore Java produce codice per una macchina virtuale conosciuta come Java Virtual Machine.
Ecco come funziona la JVM
Per prima cosa, il codice Java viene compilato in bytecode. Questo bytecode viene interpretato su diverse macchine
Tra il sistema host e il sorgente Java, il bytecode è un linguaggio intermedio.
JVM in Java è responsabile dell’allocazione dello spazio di memoria.
In questo tutorial sulla JVM, imparerai-
- Architettura della JVM
- Compilazione del codice software & Processo di esecuzione
- Processo di compilazione ed esecuzione del codice C
- Compilazione ed esecuzione del codice Java
- Perché Java è un linguaggio sia interpretato che compilato?
- Perché Java è lento?
Architettura della JVM
Ora in questo tutorial sulla JVM, cerchiamo di capire l’architettura della JVM. L’architettura JVM in Java contiene classloader, area di memoria, motore di esecuzione ecc.
1) ClassLoader
Il class loader è un sottosistema usato per caricare i file di classe. Svolge tre funzioni principali: caricamento, collegamento e inizializzazione.
2) Method Area
JVM Method Area memorizza le strutture di classe come i metadati, il pool di costanti runtime, e il codice dei metodi.
3) Heap
Tutti gli oggetti, le loro variabili di istanza correlate e gli array sono memorizzati nell’heap. Questa memoria è comune e condivisa tra più thread.
4) Pile del linguaggio JVM
Le pile del linguaggio Java memorizzano le variabili locali e i loro risultati parziali. Ogni thread ha il proprio stack JVM, creato simultaneamente alla creazione del thread. Un nuovo stack viene creato ogni volta che viene invocato un metodo, e viene cancellato quando il processo di invocazione del metodo è completo.
5) Registri PC
Il registro PC memorizza l’indirizzo dell’istruzione della macchina virtuale Java che è attualmente in esecuzione. In Java, ogni thread ha il suo registro PC separato.
6) Pile di metodi nativi
Le pile di metodi nativi contengono le istruzioni del codice nativo che dipende dalla libreria nativa. È scritto in un altro linguaggio invece che in Java.
7) Motore di esecuzione
È un tipo di software usato per testare hardware, software o sistemi completi. Il motore di esecuzione del test non porta mai alcuna informazione sul prodotto testato.
8) Interfaccia metodo nativo
L’interfaccia metodo nativo è un quadro di programmazione. Permette al codice Java che è in esecuzione in una JVM di chiamare da librerie e applicazioni native.
9) Librerie di metodi nativi
Le librerie native sono una collezione di librerie native (C, C++) che sono necessarie al motore di esecuzione.
Compilazione del codice software & Processo di esecuzione
Per scrivere ed eseguire un programma software, è necessario quanto segue
1) Editor – Per scrivere il programma, un blocco note potrebbe essere usato per questo
2) Compilatore – Per convertire il tuo programma in alto linguaggio in codice macchina nativo
3) Linker – Per combinare insieme diversi file di programma di riferimento nel tuo programma principale.
4) Loader – Per caricare i file dal tuo dispositivo di memoria secondaria come Hard Disk, Flash Drive, CD nella RAM per l’esecuzione. Il caricamento viene fatto automaticamente quando si esegue il codice.
5) Esecuzione – L’effettiva esecuzione del codice che viene gestita dal processore del sistema operativo &.
Con questo background, fate riferimento al seguente video & imparare il funzionamento interno della JVM e l’architettura della JVM (Java Virtual Machine).
Clicca qui se il video non è accessibile
Processo di compilazione ed esecuzione del codice C
Per capire il processo di compilazione in Java. Diamo prima un’occhiata veloce al processo di compilazione e collegamento in C.
Supponiamo che nel main, avete chiamato due funzioni f1 e f2. La funzione principale è memorizzata nel file a1.c.
Funzione f1 è memorizzata in un file a2.c
La funzione f2 è memorizzata in un file a3.c
Tutti questi file, cioè, a1.c, a2.c, e a3.c, sono inviati al compilatore. Il cui output è il corrispondente file oggetto che è il codice macchina.
Il passo successivo è integrare tutti questi file oggetto in un singolo file .exe con l’aiuto del linker. Il linker raggrupperà tutti questi file e produrrà il file .exe.
Durante l’esecuzione del programma, un programma loader carica un .exe nella RAM per l’esecuzione.
Compilazione ed esecuzione del codice Java nella Java VM
Ora in questo tutorial sulla JVM, vediamo il processo per JAVA. Nel tuo main, hai due metodi f1 e f2.
- Il metodo principale è memorizzato nel file a1.java
- f1 è memorizzato in un file come a2.java
- f2 è memorizzato in un file come a3.java
Il compilatore compila i tre file e produce 3 file .class corrispondenti che consistono di codice BYTE. A differenza del C, non viene fatto alcun collegamento.
La Java VM o Java Virtual Machine risiede sulla RAM. Durante l’esecuzione, utilizzando il caricatore di classi, i file di classe vengono portati sulla RAM. Il codice BYTE è verificato per qualsiasi violazione della sicurezza.
In seguito, il motore di esecuzione convertirà il Bytecode in codice macchina nativo. Questa è la compilazione just in time. È una delle ragioni principali per cui Java è relativamente lento.
NOTE: Il compilatore JIT o Just-in-time è la parte della Java Virtual Machine (JVM). Interpreta una parte del codice byte che ha funzionalità simili allo stesso tempo.
Perché Java è un linguaggio sia interpretato che compilato?
I linguaggi di programmazione sono classificati come
- Linguaggio di livello superiore Es. C++, Java
- Linguaggi di medio livello es. C
- Linguaggio di basso livello Ex. Assembly
- finalmente il livello più basso come il linguaggio macchina.
Un compilatore è un programma che converte un programma da un livello di linguaggio ad un altro. Esempio di conversione del programma C++ in codice macchina.
Il compilatore java converte il codice java di alto livello in bytecode (che è anche un tipo di codice macchina).
Un interprete è un programma che converte un programma a un livello in un altro linguaggio di programmazione allo stesso livello. Esempio di conversione di un programma Java in C++
In Java, il generatore di codice Just In Time converte il bytecode nel codice macchina nativo che sono agli stessi livelli di programmazione.
Quindi, Java è sia un linguaggio compilato che interpretato.
Perché Java è lento?
Le due ragioni principali dietro la lentezza di Java sono
- Dynamic Linking: A differenza del C, il linking viene fatto a run-time, ogni volta che il programma viene eseguito in Java.
- Interprete run-time: La conversione del codice byte in codice macchina nativo è fatta a tempo di esecuzione in Java che rallenta ulteriormente la velocità
Tuttavia, l’ultima versione di Java ha affrontato i colli di bottiglia delle prestazioni in larga misura.
Sommario:
- La forma completa di JVM è Java Virtual Machine. La JVM in Java è il motore che guida il codice Java. Converte il bytecode Java in linguaggio macchina.
- L’architettura JVM in Java contiene classloader, area di memoria, motore di esecuzione ecc.
- Nella JVM, il codice Java è compilato in bytecode. Questo bytecode viene interpretato su diverse macchine
- JIT sta per Just-in-time compiler. JIT è la parte della Java Virtual Machine (JVM). Viene usata per accelerare il tempo di esecuzione
- In confronto ad altre macchine compilatrici, la JVM in Java può essere lenta nell’esecuzione.