Java Virtual Machine - Guida all'architettura di JVM con i suoi componenti

Sommario:

Anonim

Introduzione a Java Virtual Machine

In questo articolo impareremo a conoscere Java Virtual Machine, alias "JVM". Java Virtual Machine è una macchina virtuale che consente a un sistema informatico di eseguire / eseguire programmi Java. Fondamentalmente, JVM è un motore, che funziona come un ambiente di runtime per il codice Java. JVM converte il codice java in linguaggio macchina. Quando si esegue un file .class compilato, si passa a JVM e quindi JVM restituisce l'output. Java Virtual Machine fa parte di JRE, che sta per "Java Runtime Environment". Le attività di base per una Java Virtual Machine consistono nel caricare il codice, quindi verificare il codice ed eseguirlo. Inoltre, fornire l'ambiente di runtime per l'esecuzione del codice. JVM è costituito da vari componenti come Classloader, Elenco di spazi assegnati da JVM come Stack, un motore di esecuzione e alcune librerie native.

L'architettura di Java Virtual Machine

Come mostrato nell'immagine sopra, Java Virtual Machine Architecture è costituito da vari componenti. Impariamo individualmente ogni singolo componente.

caricatore

Come suggerisce il nome, è un componente responsabile del caricamento dei file di classe. Caricamento, collegamento e inizializzazione di un file di classe, sono le principali funzioni di Loader. Il caricatore funziona in runtime.

  • Caricamento: in pratica, il caricatore legge il file .class, quindi genera il codice binario e lo salva in un'area del metodo. Bootstrap Classloader, Extension Classloader e Application Classloader sono i vari ClassLoaders responsabili del caricamento di varie classi.
  • Collegamento: tre funzioni principali come verifica, preparazione e risoluzione. Si inizia con la verifica del file .class. Se la verifica non riesce, viene generata un'eccezione per la verifica del tempo di esecuzione. Successivamente, la memoria viene allocata alle variabili con valori predefiniti. Quindi, infine, i riferimenti di memoria simbolica vengono sostituiti con riferimento diretto dall'area di memoria.
  • Inizializzazione: questa è una parte finale di ClassLoader. I valori originali sono assegnati a tutte le variabili statiche, seguite dall'esecuzione di Blocco statico. Questa parte viene eseguita dall'inizio alla fine di una classe.

Mucchio

I dettagli di un oggetto e le variabili di istanza sono tutti memorizzati qui. È un'area di memoria condivisa, il che significa che i dati memorizzati qui non sono thread-safe.

Eccezione nel thread "main" java.lang.OutOfMemoryError: spazio heap Java

Uno degli errori più pertinenti è l'eccezione "OutOfMemoryError ", il che significa che la JVM non può allocare un oggetto nell'area Heap o non è possibile eseguire l'allocazione di memoria per lo stesso oggetto.

Pila

Qui è dove viene creato uno stack di runtime separato per ogni nuovo thread. Conosciuto anche come Run-Time Stack, ogni volta che viene richiamato un metodo, tutti i dettagli vengono archiviati nel corrispondente stand di runtime e dopo il completamento del metodo, questi dettagli vengono rimossi dallo stack.

Registri PC

Per ogni singolo thread, viene creato un registro PC (Program Counter) separato, che memorizza l'indirizzo dell'istruzione di esecuzione corrente, che, in seguito, verrà aggiornata con l'istruzione successiva. Questa area di memoria è piuttosto piccola ed è di dimensioni fisse.

Stack con metodo nativo

È uno dei suoi tipi di area di memoria, che viene invocato da un thread e quindi il thread è a un livello completamente nuovo in cui le restrizioni di struttura e sicurezza implicite da Java Virtual Machine non sono più in esercizio. Rispetto ad altre aree di memoria di runtime, la memoria occupata dagli stack del metodo nativo non ha dimensioni fisse, senza limiti di incremento o decremento.

Interfaccia nativa Java

JNI interagisce semplicemente con le librerie dei metodi nativi sotto menzionate che sono di implementazione C, C ++ e forniscono lo stesso al motore di esecuzione. L'accesso diretto al codice assembly è consentito da JNI. Per una JVM, Java e Native sono i due tipi di codici. Il JNI stabilisce senza problemi un collegamento ben definito tra questi due.

Librerie di metodi nativi

Raccolta di librerie native, come richiesto dal motore di esecuzione.

Motore di esecuzione

Bene, ora abbiamo un programma java in bytecode, che viene assegnato alle aree di dati sopra spiegate tramite un caricatore di classi, e ora il bytecode verrà eseguito dal motore di esecuzione. Il motore di esecuzione legge semplicemente il bytecode in unità, come una macchina che legge le righe di codice una per una. Il bytecode è un formato leggibile dall'uomo, motivo per cui la macchina non è in grado di leggerlo, lo è e deve essere convertito in un formato leggibile dalla macchina, in cui i componenti seguenti vengono utilizzati a scopo di interpretazione.

Il motore di esecuzione ha tre componenti principali, ovvero interprete, compilatore JIT e Garbage Collector.

1. Interprete

Semplicemente, esegue il bytecode in un metodo sequenziale. Una chiamata viene effettuata da una query della riga di comando con un file compilato come argomento. L'interprete è abbastanza veloce nell'interpretare ed eseguire i comandi uno per uno, cosa che avviene più velocemente del compilatore JIT per compilare il codice.

nome della classe java

Una classe main () è obbligatoria in un file .class compilato.

2. Compilatore JIT

Uno dei componenti più importanti di Java Runtime Environment, che migliora le prestazioni dell'applicazione Java in fase di esecuzione. Nessun altro componente ha un impatto maggiore sulle prestazioni del compilatore JIT. Questo è un compilatore predefinito e viene attivato quando viene chiamato un metodo Java.

3. Garbage Collector

Come suggerisce il nome, ha qualcosa a che fare con la spazzatura, Garbage Collector cerca semplicemente ogni possibile oggetto disponibile nello spazio heap JVM, controlla se è in uso e quindi elimina quelli inutilizzati. Quindi, segna semplicemente i pezzi di memoria che sono in uso o meno. Quindi continua a spazzare, dove rimuove semplicemente l'oggetto contrassegnato. Il miglior caso d'uso è che non è necessario alcun sistema di allocazione manuale della memoria poiché Garbage Collector svolge automaticamente il compito di rimuovere lo spazio di memoria inutilizzato. Tuttavia, poiché si tratta di un'attività automatica, nessun programmatore ha il controllo sulla pianificazione di qualsiasi intervallo di tempo per attività di pulizia specifiche e richiede più potenza della CPU durante la ricerca di riferimenti a oggetti.

Conclusione

Sebbene non sia obbligatorio avere una chiara comprensione di come funziona JVM, allo scopo di scrivere codice Java, è immensamente utile. Per uno sviluppatore che capisce il funzionamento di JVM, scriverà un codice migliore e ottimizzato, per quanto lungo o complesso sia il requisito. Oltre alla descrizione fornita qui, JVM offre una vasta gamma di funzionalità e tecnologie. Queste funzionalità possono essere utilizzate per migliorare le prestazioni secondo le esigenze di un fornitore specifico

Articoli consigliati

Questa è una guida a Java Virtual Machine. Qui discutiamo l'architettura della macchina virtuale Java insieme ai suoi vari componenti. Puoi anche consultare i seguenti articoli per saperne di più -

  1. Bubble Ordina in JavaScript
  2. Thread Ciclo di vita in Java
  3. Che cos'è Java SE?
  4. I migliori compilatori Java
  5. JRE vs JVM | Le 8 principali differenze con (Infografica)