Differenza tra JVM, JRE e JDK

1. Panoramica

In questo articolo, discuteremo le differenze tra JVM, JRE e JDK considerando i loro componenti e usi.

2. JVM

Java Virtual Machine (JVM) è un'implementazione di una macchina virtuale che esegue un programma Java.

La JVM interpreta prima il bytecode. Quindi memorizza le informazioni sulla classe nell'area di memoria. Infine, esegue il bytecode generato dal compilatore java.

È una macchina informatica astratta con un proprio set di istruzioni e manipola varie aree di memoria in fase di esecuzione.

I componenti della JVM sono:

  • Caricatori di classe
  • Aree dati di runtime
  • Motore di esecuzione

2.1. Caricatori di classe

Le attività iniziali della JVM includono il caricamento, la verifica e il collegamento del bytecode. I caricatori di classi gestiscono queste attività.

Abbiamo un articolo dettagliato specificamente sui caricatori di classi.

2.2. Aree dati di runtime

La JVM definisce varie aree di memoria per eseguire un programma Java. Questi vengono utilizzati durante il runtime e sono noti come aree dati di runtime. Alcune di queste aree vengono create all'avvio della JVM e distrutte quando la JVM esce, mentre altre vengono create quando viene creato un thread e distrutte quando un thread esce.

Consideriamo queste aree una per una:

Area del metodo

Fondamentalmente, l'area del metodo è analoga all'area di archiviazione per il codice compilato. Memorizza strutture come pool di costanti di runtime, dati di campi e metodi, il codice per metodi e costruttori, nonché nomi di classi completi. La JVM memorizza queste strutture per ogni classe.

L'area del metodo, nota anche come spazio di generazione permanente (PermGen), viene creata all'avvio della JVM. La memoria per quest'area non deve essere contigua. Tutti i thread JVM condividono questa area di memoria.

Area dell'heap

La JVM alloca la memoria per tutte le istanze di classe e gli array da quest'area.

Garbage Collector (GC) recupera la memoria heap per gli oggetti. Fondamentalmente, GC ha tre fasi per recuperare la memoria dagli oggetti, vale a dire. due GC minori e un GC maggiore.

La memoria heap ha tre parti:

  • Eden Space - fa parte dello spazio Young Generation. Quando creiamo un oggetto, la JVM alloca la memoria da questo spazio
  • Survivor Space: fa anche parte dello spazio Young Generation. Lo spazio dei sopravvissuti contiene oggetti esistenti che sono sopravvissuti alle fasi GC minori di GC
  • Tenured Space - questo è anche conosciuto come lo spazio di vecchia generazione. Contiene oggetti sopravvissuti a lungo. Fondamentalmente, viene impostata una soglia per gli oggetti Young Generation e quando questa soglia viene raggiunta, questi oggetti vengono spostati in uno spazio di proprietà.

JVM crea un'area di heap non appena viene avviato. Tutti i thread della JVM condividono quest'area. La memoria per l'area di heap non deve essere contigua.

Area dello stack

Memorizza i dati come frame e ogni frame memorizza variabili locali, risultati parziali e chiamate a metodi annidati. JVM crea l'area dello stack ogni volta che crea un nuovo thread. Questa area è privata per ogni thread.

Ogni voce nello stack è denominata Stack Frame o record di attivazione. Ogni frame contiene tre parti:

  • Array di variabili locali: contiene tutte le variabili ei parametri locali del metodo
  • Stack di operandi: utilizzato come spazio di lavoro per memorizzare il risultato del calcolo intermedio
  • Frame Data: utilizzato per memorizzare risultati parziali, restituire valori per i metodi e fare riferimento alla tabella delle eccezioni che fornisce le informazioni sui blocchi di cattura corrispondenti in caso di eccezioni

La memoria per lo stack JVM non deve essere contigua.

Registri PC

Ogni thread JVM ha un registro PC separato che memorizza l'indirizzo dell'istruzione attualmente in esecuzione. Se l'istruzione attualmente in esecuzione fa parte del metodo nativo, questo valore non è definito.

Stack di metodi nativi

I metodi nativi sono quelli scritti in linguaggi diversi da Java.

JVM fornisce funzionalità per chiamare questi metodi nativi. Gli stack del metodo nativo sono noti anche come "stack C". Memorizzano le informazioni sul metodo nativo. Ogni volta che i metodi nativi vengono compilati in codici macchina, di solito usano uno stack di metodi nativi per tenere traccia del loro stato.

La JVM crea questi stack ogni volta che crea un nuovo thread. E quindi i thread JVM non condividono quest'area.

2.3. Motore di esecuzione

Il motore di esecuzione esegue le istruzioni utilizzando le informazioni presenti nelle aree di memoria. Ha tre parti:

Interprete

Una volta che i classloader caricano e verificano il bytecode, l'interprete esegue il bytecode riga per riga. Questa esecuzione è piuttosto lenta. Lo svantaggio dell'interprete è che quando un metodo viene chiamato più volte, ogni volta che è richiesta una nuova interpretazione.

Tuttavia, la JVM utilizza il compilatore JIT per mitigare questo svantaggio.

Compilatore Just-In-Time (JIT)

Il compilatore JIT compila il bytecode dei metodi spesso chiamati in codice nativo in fase di esecuzione. Quindi è responsabile dell'ottimizzazione dei programmi Java.

JVM monitora automaticamente quali metodi vengono eseguiti. Una volta che un metodo diventa idoneo per la compilazione JIT, è pianificato per la compilazione in codice macchina. Questo metodo è quindi noto come metodo a caldo. Questa compilazione in codice macchina avviene su un thread JVM separato.

Di conseguenza, non interrompe l'esecuzione del programma corrente. Dopo la compilazione in codice macchina, viene eseguito più velocemente.

Netturbino

Java si occupa della gestione della memoria utilizzando Garbage Collection. È un processo che esamina la memoria dell'heap, identifica quali oggetti sono in uso e quali no, e infine elimina gli oggetti inutilizzati.

GC è un thread daemon. Può essere chiamato esplicitamente utilizzando System. Il metodo gc () , tuttavia, non verrà eseguito immediatamente e la JVM decide quando richiamare GC.

2.4. Interfaccia nativa Java

Funge da interfaccia tra il codice Java e le librerie native (C / C ++).

Esistono situazioni in cui Java da solo non soddisfa le esigenze dell'applicazione, ad esempio l'implementazione di una funzionalità dipendente dalla piattaforma.

In questi casi, possiamo usare JNI per abilitare il codice in esecuzione nella JVM da chiamare. Al contrario, consente ai metodi nativi di chiamare il codice in esecuzione nella JVM.

2.5. Librerie native

Si tratta di librerie specifiche della piattaforma e contengono l'implementazione di metodi nativi.

3. JRE

Java Runtime Environment (JRE) è un insieme di componenti software utilizzati per eseguire applicazioni Java.

I componenti principali del JRE includono:

  • Un'implementazione di una Java Virtual Machine (JVM)
  • Classi richieste per eseguire i programmi Java
  • File delle proprietà

Abbiamo discusso della JVM nella sezione precedente. Qui ci concentreremo sulle classi principali e sui file di supporto.

3.1. Classi Bootstrap

Troveremo le classi bootstrap in jre / lib / . Questo percorso è noto anche come percorso di classe bootstrap. Include:

  • Classi runtime in rt.jar
  • Classi di internazionalizzazione in i18n.jar
  • Classi di conversione dei caratteri in charsets.jar
  • Altri

Bootstrap ClassLoader carica queste classi all'avvio della JVM.

3.2. Classi di estensione

Possiamo trovare classi di estensione in jre / lib / extn / che funge da directory per le estensioni alla piattaforma Java. Questo percorso è noto anche come percorso classe di estensione.

Contiene le librerie di runtime JavaFX in jfxrt.jar e i dati della locale per i pacchetti java.text e java.util in localedata.jar . Gli utenti possono anche aggiungere vasi personalizzati in questa directory.

3.3. Impostazioni proprietà

La piattaforma Java utilizza queste impostazioni delle proprietà per mantenere la propria configurazione. A seconda del loro utilizzo, si trovano in cartelle diverse all'interno di / jre / lib / . Questi includono:

  • Configurazioni del calendario in calendar.properties
  • Registrazione delle configurazioni in logging.properties
  • Configurazioni di rete in net.properties
  • Proprietà di distribuzione in / jre / lib / deploy /
  • Proprietà di gestione in / jre / lib / management /

3.4. Altri file

Oltre ai file e alle classi sopra menzionati, JRE contiene anche file per altri argomenti:

  • Gestione della sicurezza in jre / lib / security
  • La directory per posizionare le classi di supporto per applet in jre / lib / applet
  • File relativi ai caratteri in jre / lib / fonts e altri

4. JDK

Java Development Kit (JDK) fornisce l'ambiente e gli strumenti per lo sviluppo, la compilazione, il debug e l'esecuzione di un programma Java.

I componenti principali di JDK includono:

  • JRE
  • Strumenti di sviluppo

Abbiamo discusso il JRE nella sezione precedente.

Ora ci concentreremo su vari strumenti di sviluppo. Classifichiamo questi strumenti in base al loro utilizzo:

4.1. Strumenti di base

Questi strumenti pongono le basi del JDK e vengono utilizzati per creare e costruire applicazioni Java. Tra questi strumenti, possiamo trovare utilità per la compilazione, il debug, l'archiviazione, la generazione di Javadoc, ecc.

Loro includono:

  • javac - legge le definizioni di classe e interfaccia e le compila in file di classe
  • java: avvia l'applicazione Java
  • javadoc - genera pagine HTML di documentazione API da file sorgente Java
  • apt - trova ed esegue i processori di annotazione in base alle annotazioni presenti nel set di file sorgente specificati
  • appletviewer : ci consente di eseguire applet Java senza un browser web
  • jar : racchiude applet o applicazioni Java in un unico archivio
  • jdb: uno strumento di debug della riga di comando utilizzato per trovare e correggere bug nelle applicazioni Java
  • javah - produce intestazione C e file sorgente da una classe Java
  • javap: disassembla i file di classe e visualizza le informazioni su campi, costruttori e metodi presenti in un file di classe
  • extcheck: rileva i conflitti di versione tra il file JAR (Java Archive) di destinazione e i file JAR con estensione attualmente installati

4.2. Strumenti di sicurezza

Questi includono strumenti di gestione delle chiavi e dei certificati utilizzati per manipolare i keystore Java.

Un archivio chiavi Java è un contenitore per certificati di autorizzazione o certificati di chiave pubblica. Di conseguenza, viene spesso utilizzato dalle applicazioni basate su Java per la crittografia, l'autenticazione e il servizio su HTTPS.

Inoltre, aiutano a impostare le politiche di sicurezza sul nostro sistema e a creare applicazioni che possono funzionare nell'ambito di queste politiche nell'ambiente di produzione. Questi includono:

  • keytool: aiuta nella gestione delle voci del keystore, vale a dire chiavi crittografiche e certificati
  • jarsigner: genera file JAR con firma digitale utilizzando le informazioni del keystore
  • policytool: ci consente di gestire i file di configurazione dei criteri esterni che definiscono i criteri di sicurezza dell'installazione

Alcuni strumenti di sicurezza aiutano anche nella gestione dei ticket Kerberos.

Kerberos è un protocollo di autenticazione di rete.

Funziona sulla base di ticket per consentire ai nodi che comunicano su una rete non sicura di dimostrare la propria identità in modo sicuro:

  • kinit: utilizzato per ottenere e memorizzare nella cache i ticket di concessione dei ticket Kerberos
  • ktab - gestisce i nomi principali e le coppie di chiavi nella tabella delle chiavi
  • klist: visualizza le voci nella cache delle credenziali locali e nella tabella delle chiavi

4.3. Strumento di internazionalizzazione

L'internazionalizzazione è il processo di progettazione di un'applicazione in modo che possa essere adattata a varie lingue e regioni senza modifiche tecniche.

A questo scopo, JDK porta native2ascii. Questo strumento converte un file con caratteri supportati da JRE in file codificati in escape ASCII o Unicode.

4.4. Strumenti RMI (Remote Method Invocation)

Gli strumenti RMI consentono la comunicazione remota tra le applicazioni Java fornendo così la possibilità di sviluppo di applicazioni distribuite.

RMI consente a un oggetto in esecuzione in una JVM di richiamare metodi su un oggetto in esecuzione in un'altra JVM. Questi strumenti includono:

  • rmic - genera classi stub, skeleton e tie per oggetti remoti utilizzando Java Remote Method Protocol (JRMP) o Internet Inter-Orb Protocol (IIOP)
  • rmiregistry - crea e avvia il registro degli oggetti remoti
  • rmid - s avvia il demone del sistema di attivazione. Ciò consente agli oggetti di essere registrati e attivati ​​in una Java Virtual Machine
  • serialver - restituisce l'UID della versione seriale per le classi specificate

4.5. Strumenti Java IDL e RMI-IIOP

Java Interface Definition Language (IDL) aggiunge funzionalità CORBA (Common Object-Based Request Broker Architecture) alla piattaforma Java.

Questi strumenti consentono alle applicazioni Web Java distribuite di richiamare operazioni su servizi di rete remoti utilizzando IDL (Object Management Group) standard del settore.

Allo stesso modo, potremmo usare il protocollo Internet InterORB (IIOP).

RMI-IIOP, ovvero RMI su IIOP, consente la programmazione di server e applicazioni CORBA tramite l'API RMI. Consentendo così la connessione tra due applicazioni scritte in qualsiasi linguaggio conforme a CORBA tramite Internet InterORB Protocol (IIOP).

Questi strumenti includono:

  • tnameserv - Transient Naming Service che fornisce una directory strutturata ad albero per i riferimenti agli oggetti
  • idlj - il compilatore da IDL a Java per generare i collegamenti Java per un file IDL specificato
  • orbd: consente ai client di individuare e richiamare in modo trasparente gli oggetti persistenti sul server nell'ambiente CORBA
  • servertool: fornisce un'interfaccia a riga di comando per registrare o annullare la registrazione di un server persistente con ORB Daemon ( orbd ), avviare e arrestare un server persistente registrato con ORB Daemon, ecc.

4.6. Strumenti di distribuzione Java

Questi strumenti aiutano nella distribuzione di applicazioni e applet Java sul Web. Loro includono:

  • pack200 - trasforma un file JAR in un file pack200 utilizzando il compressore Java gzip
  • unpack200 - trasforma il file pack200 in un file JAR

4.7. Strumento plug-in Java

JDK ci fornisce htmlconverter. Inoltre, viene utilizzato insieme al plug-in Java.

Da un lato, Java Plug-in stabilisce una connessione tra i browser più diffusi e la piattaforma Java. Come risultato di questa connessione, le applet sul sito web possono essere eseguite all'interno di un browser.

D'altra parte, htmlconverter è un'utilità per convertire una pagina HTML contenente applet in un formato per Java Plug-in.

4.8. Strumento di avvio Web Java

JDK porta javaws. Possiamo usarlo insieme a Java Web Start.

Questo strumento ci consente di scaricare e avviare applicazioni Java con un solo clic dal browser. Quindi, non è necessario eseguire alcun processo di installazione.

4.9. Strumenti di monitoraggio e gestione

Questi sono ottimi strumenti che possiamo utilizzare per monitorare le prestazioni della JVM e il consumo di risorse. Eccone alcuni:

  • jconsole: fornisce una console grafica che consente di monitorare e gestire le applicazioni Java
  • jps: elenca le JVM strumentate sul sistema di destinazione
  • jstat - monitora le statistiche JVM
  • jstatd: monitora la creazione e la terminazione di JVM strumentate

4.10. Strumenti per la risoluzione dei problemi

Questi sono strumenti sperimentali che possiamo sfruttare per le attività di risoluzione dei problemi :

  • info: genera le informazioni di configurazione per un processo Java specificato
  • jmap - stampa le mappe di memoria degli oggetti condivisi o i dettagli della memoria heap di un processo specificato
  • jsadebugd - si collega a un processo Java e funge da server di debug
  • jstack: stampa le tracce dello stack Java dei thread Java per un determinato processo Java

5. conclusione

In questo articolo, abbiamo identificato che la differenza fondamentale tra JVM, JRE e JDK risiede nel loro utilizzo.

Innanzitutto, abbiamo descritto come la JVM è una macchina informatica astratta che esegue effettivamente il bytecode Java.

Quindi, abbiamo spiegato come eseguire solo applicazioni Java, usiamo JRE.

E finalmente abbiamo capito come sviluppare applicazioni Java, usiamo il JDK.

Abbiamo anche impiegato del tempo per approfondire gli strumenti e i concetti fondamentali di questi componenti.