Cos'è la JVM? Spiega la JVM Architectura

⚡ Riepilogo intelligente

Java La macchina virtuale (JVM) è il motore che fornisce un ambiente di runtime per guidare Java codice, convertendo il bytecode indipendente dalla piattaforma in linguaggio macchina nativo. Fa parte del Java Ambiente di runtime e abilita JavaLa sua portabilità "scrivi una volta, esegui ovunque".

  • 🧩 Bytecode Bridge: Migliori Java Il compilatore produce bytecode anziché codice macchina, e la JVM interpreta tale bytecode su qualsiasi sistema host.
  • ???? ️ Nucleo Architecnologia: La JVM combina un ClassLoader, un'area di metodi, un heap, degli stack, dei registri PC e un motore di esecuzione per eseguire i programmi.
  • 🔄 Flusso di compilazione: A differenza di C, Java Non richiede alcun collegamento; i file di classe vengono caricati nella RAM, verificati e quindi eseguiti in fase di runtime.
  • Compilatore JIT: Il compilatore Just-In-Time converte il bytecode in codice macchina nativo durante l'esecuzione per migliorare le prestazioni.
  • ???? Nota sulle prestazioni: Il collegamento dinamico e l'interpretazione in fase di esecuzione storicamente rendono Java più lente, anche se le versioni moderne colmano ampiamente questo divario.

JVM Architectura

In cosa consiste la JVM? Java?

Java Macchina virtuale (JVM) è un motore che fornisce un ambiente runtime per gestire Java codice o applicazioni. Converte Java bytecode in linguaggio macchina. JVM fa parte di Java Ambiente di runtime (JRE). In altri linguaggi di programmazione, il compilatore produce codice macchina per un particolare sistema. Tuttavia, il Java il compilatore produce codice per una macchina virtuale nota come Java Macchina virtuale.

Come funziona la JVM?

In primo luogo, Java Il codice viene compilato in bytecode. Questo bytecode viene interpretato su macchine diverse. Tra il sistema host e il Java sorgente, il bytecode è un linguaggio intermedio. JVM in Java è responsabile dell'allocazione dello spazio di memoria.

Lavoro di Java Macchina virtuale JVM

Lavoro di Java Macchina virtuale (JVM)

Archistruttura di JVM (Java Macchina virtuale)

Ora, cerchiamo di capire l'architettura della JVM. L'architettura della JVM in Java contiene un classloader, un'area di memoria, un motore di esecuzione e altro ancora.

JVM Architectura

Java Macchina virtuale Architectura

1) Caricatore di classi
Il class loader è un sottosistema utilizzato per caricare i file di classe. Svolge tre funzioni principali: caricamento, collegamento e inizializzazione.

2) Area Metodo
L'area dei metodi della JVM memorizza le strutture delle classi, come i metadati, il pool di runtime delle costanti e il codice dei metodi.

3) Mucchio
Tutto l' Oggetti, le variabili di istanza correlate e gli array vengono archiviati nell'heap. Questa memoria è comune e condivisa tra più thread.

4) Stack del linguaggio JVM
Java Gli stack del linguaggio memorizzano le variabili locali e i loro risultati parziali. Ogni thread ha il proprio stack JVM, creato simultaneamente alla creazione del thread stesso. Un nuovo frame viene creato ogni volta che viene richiamato un metodo e viene eliminato al termine del processo di invocazione del metodo.

5) Registri PC
Il registro del PC memorizza l'indirizzo del Java istruzione della macchina virtuale attualmente in esecuzione. In Java, ogni thread ha il proprio registro PC separato.

6) Stack di metodi nativi
Gli stack dei metodi nativi contengono le istruzioni del codice nativo che dipendono dalla libreria nativa. È scritto in un altro linguaggio invece di Java.

7) Motore di esecuzione
Il motore di esecuzione legge il bytecode e lo esegue pezzo per pezzo. Utilizza un interprete e un compilatore Just-In-Time (JIT) per convertire il bytecode in codice macchina nativo ed eseguirlo.

8) Interfaccia del metodo nativo
La Native Method Interface è un framework di programmazione. Permette Java codice in esecuzione in una JVM per chiamare, ed essere chiamato da, applicazioni e librerie native.

9) Librerie di metodi nativi
Native Libraries è una raccolta di librerie native (C, C++) necessari al motore di esecuzione.

Software Code Processo di compilazione ed esecuzione

Per scrivere ed eseguire un programma software, sono necessari i seguenti elementi:

  • 1) Editore – Per digitare il programma, si può usare un blocco note.
  • 2) Compiler – Per convertire il tuo programma in un linguaggio di alto livello in codice macchina nativo.
  • 3) Collegamento – Per combinare i diversi riferimenti ai file di programma presenti nel programma principale.
  • 4) Caricatore – Per caricare i file dal dispositivo di archiviazione secondario, come un disco rigido, una chiavetta USB o un CD, nella RAM per l'esecuzione. Il caricamento avviene automaticamente all'esecuzione del codice.
  • 5) Esecuzione – L'effettiva esecuzione del codice, gestita dal sistema operativo e dal processore.

Con queste premesse, fai riferimento al seguente video e scopri il funzionamento interno e l'architettura della JVM (Java macchina virtuale).

Clicchi Qui. se il video non è accessibile

Processo di compilazione ed esecuzione del codice C

Per capire il Java Processo di compilazione: diamo prima una rapida occhiata al processo di compilazione e collegamento in C.

Supponiamo che nella funzione main siano state chiamate due funzioni, f1 e f2. La funzione main è memorizzata nel file a1.c.

Codice C funzione principale a1.c

La funzione f1 è memorizzata nel file a2.c.

Funzione del codice C f1 a2.c

La funzione f2 è memorizzata nel file a3.c.

Funzione del codice C f2 a3.c

Tutti questi file, ovvero a1.c, a2.c e a3.c, vengono passati al compilatore, il cui output sono i corrispondenti file oggetto, che rappresentano il codice macchina.

Il compilatore di codice C produce file oggetto

Il passo successivo consiste nell'integrare tutti questi file oggetto in un singolo file .exe con l'aiuto di un linker. Il linker raggrupperà tutti questi file e genererà il file .exe.

Il linker del codice C produce un file eseguibile (exe).

Durante l'esecuzione del programma, un programma di caricamento caricherà a.exe nel RAM per l'esecuzione.

Il caricatore di codice C carica l'eseguibile nella RAM

Java Compilazione ed esecuzione del codice in Java VM

Ora esaminiamo il processo per JavaNel tuo file 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

Java il codice compila tre file in file di classe

Il compilatore compilerà i tre file e produrrà tre file .class corrispondenti, che consistono in codice BYTE. A differenza del linguaggio C, non viene effettuato alcun collegamento.

Migliori Java VM, oro Java La macchina virtuale risiede nella RAM. Durante l'esecuzione, tramite il class loader, i file di classe vengono caricati nella RAM. Il bytecode viene verificato per individuare eventuali falle di sicurezza.

Java Il class loader carica i file di classe nella RAM

Successivamente, il motore di esecuzione convertirà il bytecode in codice macchina nativo. Questa è la compilazione just-in-time. È uno dei motivi principali per cui Java è relativamente lento.

Java Il motore di esecuzione converte il bytecode in codice nativo.

NOTA: JIT, o compilatore Just-in-time, è la parte del Java Macchina virtuale (JVM). Interpreta simultaneamente parti del bytecode che hanno funzionalità simili.

Perché è Java sia il linguaggio interpretato che quello compilato?

Linguaggi di programmazione sono classificati come:

  • Linguaggio di livello superiore, ad esempio, C++, Java
  • Linguaggi di livello intermedio, ad esempio C
  • Linguaggio di basso livello, ad esempio, Assembly
  • Infine, il livello più basso è il linguaggio macchina.

A compilatore è un programma che converte un programma da un livello di linguaggio a un altro. Ad esempio, la conversione di un C++ programma in codice macchina. Il Java il compilatore converte il linguaggio di alto livello Java codice in bytecode (che è anch'esso un tipo di codice macchina).

An interprete è un programma che converte un programma di un livello in un altro linguaggio di programmazione stesso livello. Ad esempio, la conversione di un Java programma in C++.

In Java, il generatore di codice Just-In-Time converte il bytecode in codice macchina nativo, che si trovano agli stessi livelli di programmazione. Pertanto, Java è un linguaggio sia compilato che interpretato.

Perché è Java lento?

Le due ragioni principali dietro la lentezza di Java siamo:

  1. Collegamento dinamico: A differenza del C, il collegamento viene eseguito in fase di esecuzione, ogni volta che il programma viene eseguito Java.
  2. Interprete in fase di esecuzione: La conversione del codice byte in codice macchina nativo viene eseguita in fase di esecuzione in Java, il che rallenta ulteriormente la velocità.

Tuttavia, le ultime versioni di Java hanno affrontato in larga misura questi colli di bottiglia prestazionali.

DOMANDE FREQUENTI

La JVM esegue framework di intelligenza artificiale e big data come Deeplearning4j, Weka e Apache. SparkIl suo compilatore Just-In-Time e la gestione della memoria consentono a queste librerie di elaborare grandi set di dati in modo efficiente su diverse piattaforme senza dover riscrivere il codice nativo.

Sì. I profiler assistiti dall'IA possono analizzare i log della garbage collection, suggerire le dimensioni dell'heap e segnalare i metodi lenti. Aiutano a ottimizzare i flag della JVM e a individuare i colli di bottiglia più rapidamente, sebbene uno sviluppatore debba comunque convalidare ogni modifica consigliata.

La JVM esegue il bytecode. La JRE raggruppa la JVM con le librerie principali necessarie per l'esecuzione. Java programmi. Il JDK aggiunge strumenti di sviluppo come il compilatore e il debugger, quindi viene utilizzato per creare applicazioni.

Il bytecode è indipendente dalla piattaforma, ma la JVM stessa dipende dalla piattaforma. Ogni sistema operativo necessita di una propria implementazione della JVM. Questa architettura permette di eseguire lo stesso bytecode compilato ovunque sia installata una JVM compatibile.

Riassumi questo post con: