Cos'è JVM?
Java Virtual Machine (JVM) è un motore che fornisce l'ambiente di runtime per guidare il codice Java o le applicazioni. Converte bytecode Java in linguaggio macchina. JVM fa 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 nota come Java Virtual Machine.
Ecco come funziona JVM
Innanzitutto, il codice Java è conforme al bytecode. Questo bytecode viene interpretato su macchine diverse
Tra il sistema host e il sorgente Java, Bytecode è un linguaggio intermedio.
JVM in Java è responsabile dell'allocazione dello spazio di memoria.

In questo tutorial JVM imparerai-
- Architettura JVM
- Processo di compilazione ed esecuzione del codice software
- Processo di compilazione ed esecuzione del codice C.
- Processo di compilazione ed esecuzione del codice Java
- Perché Java è sia interpretato che compilato?
- Perché Java è lento?
Architettura JVM
Ora in questo tutorial JVM, comprendiamo l'architettura di JVM. L'architettura JVM in Java contiene classloader, area di memoria, motore di esecuzione ecc.
1) ClassLoader
Il programma di caricamento classi è un sottosistema utilizzato per caricare i file di classe. Svolge tre funzioni principali vale a dire. Caricamento, collegamento e inizializzazione.
2) Area del metodo
JVM Method Area memorizza strutture di classe come i metadati, il pool di runtime costante e il codice per i metodi.
3) Heap
Tutti gli oggetti, le relative variabili di istanza e gli array vengono memorizzati nell'heap. Questa memoria è comune e condivisa tra più thread.
4) Stack di linguaggio JVM
Gli stack del linguaggio Java memorizzano variabili locali e sono risultati parziali. Ogni thread ha il proprio stack JVM, creato contemporaneamente durante la creazione del thread. Viene creato un nuovo frame ogni volta che viene richiamato un metodo e viene eliminato quando il processo di chiamata del metodo è completo.
5) Registri PC
Il registro del PC memorizza l'indirizzo dell'istruzione della macchina virtuale Java attualmente in esecuzione. In Java, ogni thread ha il proprio registro PC separato.
6) Stack di metodi nativi
Gli stack di metodi nativi contengono l'istruzione del codice nativo che dipende dalla libreria nativa. È scritto in un'altra lingua invece di Java.
7) Motore di esecuzione
È un tipo di software utilizzato per testare hardware, software o sistemi completi. Il motore di esecuzione del test non trasporta mai alcuna informazione sul prodotto testato.
8) Interfaccia Native Method
La Native Method Interface è un framework di programmazione. Consente al codice Java in esecuzione in una JVM di chiamare le librerie e le applicazioni native.
9) Librerie di metodi native
Native Libraries è una raccolta delle Native Libraries (C, C ++) necessarie per Execution Engine.
Processo di compilazione ed esecuzione del codice software
Per scrivere ed eseguire un programma software, è necessario quanto segue
1) Editor : per digitare il programma, è possibile utilizzare un blocco note
2) Compilatore - Per convertire il tuo programma in alta lingua in codice macchina nativo
3) Linker - Per combinare insieme diversi riferimenti a file di programma nel programma principale.
4) Loader - Per caricare i file dal tuo dispositivo di archiviazione secondario come Hard Disk, Flash Drive, CD nella RAM per l'esecuzione. Il caricamento viene eseguito automaticamente quando esegui il codice.
5) Esecuzione : esecuzione effettiva del codice gestita dal sistema operativo e dal processore.
Con questo background, fare riferimento al seguente video e apprendere il funzionamento interno di JVM e l'architettura di JVM (Java Virtual Machine).
Fare clic qui se il video non è accessibile
Processo di compilazione ed esecuzione del codice C.
Comprendere il processo di compilazione Java in Java. Diamo prima una rapida occhiata al processo di compilazione e collegamento in C.
Supponiamo, in linea di massima, di aver chiamato due funzioni f1 e f2. La funzione principale è memorizzata nel file a1.c.
La 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, vengono inviati al compilatore. Il cui output sono i file oggetto corrispondenti che sono il codice macchina.
Il passaggio successivo consiste nell'integrare tutti questi file oggetto in un unico file .exe con l'aiuto di linker. Il linker raggrupperà tutti questi file insieme e produrrà il file .exe.
Durante l'esecuzione del programma, un programma caricatore caricherà a.exe nella RAM per l'esecuzione.
Compilazione ed esecuzione del codice Java in Java VM
Ora in questo tutorial JVM, diamo un'occhiata al 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 compilerà i tre file e produrrà 3 file .class corrispondenti che consistono in codice BYTE. A differenza di C, non viene eseguito alcun collegamento .
La Java VM o Java Virtual Machine risiede nella RAM. Durante l'esecuzione, utilizzando il class loader, i file di classe vengono portati sulla RAM. Il codice BYTE viene verificato per eventuali violazioni della sicurezza.
Successivamente, il motore di esecuzione convertirà il Bytecode in codice macchina nativo. Questa è appena in tempo per la compilazione. È uno dei motivi principali per cui Java è relativamente lento.
NOTA: il compilatore JIT o Just-in-time fa parte della Java Virtual Machine (JVM). Interpreta parte del codice byte che ha funzionalità simili allo stesso tempo.
Perché Java è sia linguaggio interpretato che linguaggio compilato?
I linguaggi di programmazione sono classificati come- Linguaggio di livello superiore Es. C ++, Java
- Lingue di livello medio Es. C
- Linguaggio di basso livello Ex Assembly
- infine il livello più basso come Machine Language.
Un compilatore è un programma che converte un programma da un livello di linguaggio a 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 Just In Time Code converte il bytecode nel codice macchina nativo che si trova agli stessi livelli di programmazione.
Quindi, Java è sia compilato che linguaggio interpretato.
Perché Java è lento?
Le due ragioni principali dietro la lentezza di Java sono
- Collegamento dinamico: a differenza di C, il collegamento viene eseguito in fase di esecuzione, ogni volta che il programma viene eseguito in Java.
- Interprete run-time: la conversione del codice byte in codice macchina nativo viene eseguita in fase di esecuzione in Java, il che favorisce il rallentamento della velocità
Tuttavia, l'ultima versione di Java ha risolto in larga misura i colli di bottiglia delle prestazioni.
Riepilogo :
- La forma completa di JVM è Java Virtual Machine. JVM in Java è il motore che guida il codice Java. Converte bytecode Java in linguaggio macchina.
- L'architettura JVM in Java contiene classloader, area di memoria, motore di esecuzione ecc.
- In JVM, il codice Java viene compilato in bytecode. Questo bytecode viene interpretato su macchine diverse
- JIT sta per Just-in-time compilatore. JIT è la parte della Java Virtual Machine (JVM). Serve per velocizzare i tempi di esecuzione
- Rispetto ad altre macchine compilatrici, JVM in Java potrebbe essere lenta nell'esecuzione.