JAVA fundamentals

Spread the love

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.

Quali sono le differenze tra JDK, JRE e JVM?

L’immagine risponde in sintesi alla nostra domanda

Java: la d ifferenza tra JVM JDK e JRE
La differenza tra JVM JDK e JRE

È 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

Java Runtime Environment
Runtime Environment

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)

java Development Kit
Development Kit

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

Bibliografia

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.