Questo articolo parla del sistema operativo in cui può essere eseguito un programma scritto in Java.
Qual è? Tutti.
Ovvero: in una macchina virtuale!
Questo inguaggio nasce con l’obiettivo di non avere bisogno di essere “portato” da un sistema operativo ad un altro. Il programmatore non deve avare compilatori/linker specifici per ciascun sistema operativo ma deve preoccuparsi solo di scrivere codice senza preoccuparsi dove questo potrà essere eseguito. L’infrastruttura farà in modo da rendere ugualmente eseguibile questo codice.
Ma per ottenere questo dobbiamo effettuare una astrazione della macchina fisica, in modo che il programma possa essere compilato ed eseguito da questa macchina astratta e questa sia l’unica cosa che debba mediare con l’architettura sottostante senza però preoccupare minimanente lo sviluppatore.
La tecnologia (originariamente sviluppata da Sun Microsystem ma poi presa in carico da Oracle Inc.) è stata stratificata per mettere a disposizione
- un compilatore
- un linker e un ambiente di esecuzione
- uno strumento di gestione del ciclo di vita (development / test / run / deploy)
In questo contesto questi tre livelli sono denominati JVM, JRE, JDK.
Sommario
Quali sono le differenze tra JDK, JRE e JVM?
L’immagine risponde in sintesi alla nostra domanda
È un sistema di scatole cinesi. Ma vediamo in dettaglio i tre blocchi
JVM
JVM (Virtual Machine) è una macchina astratta (o virtuale). È una specificazione che fornisce un ambiente esecutivo (runtime environment) – una simulazione di un calcolatore con processore e RAM – nel quale il bytecode (lo pseudo-codice macchina che gira nello pseduo-processore) può essere caricato nella memoria virtuale ed eseguito.
Le JVM sono disponibili per una ampia varietà di piattaforme harware e software. JVM, JRE e JDK sono dipendenti dalla piattaforma perché le configurazioni per ogni sistema operativo sono diverse e, come detto, questo non deve essere una preoccupazione dello sviluppatore che deve solo scegliere la JDK del sistema operativo in cui lui è abituato a lavorare. Però, Java è indipendente dalla piattaforma: quindi lo stesso codice sorgente può essere eseguito senza cambiare una virgola in qualsiasi sistema operativo. Quello che cambia è l’implementazione della Virtual Machine. La JVM fa le seguenti cose principali:
- interpreta il codice sorgente con il just-in-time compiler e produce il bytecode allo stesso modo di un interprete (qui è molto diverso il funzionamentto dai programmi come C++ o C che vengono comletamente convertiti in codice macchina e poi eseguiti).
- esegue il bytecode
- gestisce il threading, ovvero le chiamate a funzione ed il ritorno al programma chiamante, le ricorsioni, gestendo il program counter e lo stack delle chiamate – ciò che fa un sistema operativo ma ad un livello astratto, senza un vero processore sotto).
- gestisce la memoria virtuale (creazione e distruzione degli oggetti). Su questo particolare aspetto, che è decisamente critico, se volete potete leggere quest’altro articolo del mio blog.
Una volta che però esiste l’ambiente esecutivo, che è il prossimo passaggio.
JRE
JRE (Runtime Environment). Serve a fornire un ambiente di esecuzione. È l’implementazione della JVM. Esiste fisicamente. Contiene le librerie (e ne gestisce i collegamenti) necessarie per la funzionalità del programma e inoltre contiene altri files che la VM usa durante l’esecuzione (javaw, rt.jar, etc).
JDK
JDK (Development Kit). Anche questo esiste fisicamente. Contiene il JRE + strumenti per lo sviluppo (javac, javaws, etc)
Come conoscere la versione della JRE correntemente in uso
marcob@jsbach:/opt$ java -version java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
Come cambiare JRE/JVM in corsa
Si usa il comando update-alternatives, con l’opzione –config java:
marcob@js:/usr/lib/jvm$ sudo update-alternatives --config java
Sono disponibili 4 scelte per l’alternativa (che fornisce /usr/bin/java).
Sel Percorso Priorità Stato ----------------------------------------------------------------------------- 0 /usr/lib/jvm/java-7-oracle/jre/bin/java 1095 modalità automatica 1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 modalità manuale 2 /usr/lib/jvm/java-6-oracle/jre/bin/java 1092 modalità manuale 3 /usr/lib/jvm/java-7-oracle/jre/bin/java 1095 modalità manuale *4 /usr/lib/jvm/java-8-oracle/jre/bin/java 1094 modalità manuale
Risorse nel blog
Un (presumibilmente) interessante articolo sulla gestione della memoria di una JVM
Commenti recenti