Cos'è la JVM? Presentazione della Java Virtual Machine

La Java Virtual Machine è un programma il cui scopo è eseguire altri programmi. È un'idea semplice che rappresenta anche uno dei nostri più grandi esempi di codifica di kung fu . La JVM ha sconvolto lo status quo per il suo tempo e continua a supportare l'innovazione della programmazione oggi.

A cosa serve la JVM

La JVM ha due funzioni principali: consentire l'esecuzione dei programmi Java su qualsiasi dispositivo o sistema operativo (noto come principio "Scrivi una volta, esegui ovunque") e gestire e ottimizzare la memoria del programma. Quando Java è stato rilasciato nel 1995, tutti i programmi per computer sono stati scritti su un sistema operativo specifico e la memoria del programma è stata gestita dallo sviluppatore del software. Quindi la JVM è stata una rivelazione.

JavaWorld /

Avere una definizione tecnica per la JVM è utile e c'è anche un modo quotidiano in cui gli sviluppatori di software la pensano. Analizziamoli:

  • Definizione tecnica : la JVM è la specifica per un programma software che esegue codice e fornisce l'ambiente di runtime per quel codice.
  • Definizione quotidiana : la JVM è il modo in cui eseguiamo i nostri programmi Java. Configuriamo le impostazioni della JVM e poi ci basiamo su di essa per gestire le risorse del programma durante l'esecuzione.

Quando gli sviluppatori parlano della JVM, di solito si intende il processo in esecuzione su una macchina, in particolare un server, che rappresenta e controlla l'utilizzo delle risorse per un'app Java. Confrontalo con la specifica JVM , che descrive i requisiti per la creazione di un programma che esegue queste attività.

Chi sviluppa e mantiene la JVM?

La JVM è ampiamente distribuita, ampiamente utilizzata e mantenuta da alcuni programmatori molto brillanti, sia aziendali che open source. Il progetto OpenJDK è il figlio della decisione di Sun Microsystems di open-source Java. OpenJDK è continuato attraverso la gestione di Java da parte di Oracle, con gran parte del lavoro pesante svolto in questi giorni dagli ingegneri Oracle.

Gestione della memoria nella JVM

L'interazione più comune con una JVM in esecuzione consiste nel controllare l'utilizzo della memoria nell'heap e nello stack. La regolazione più comune è l'ottimizzazione delle impostazioni di memoria della JVM.

Raccolta dei rifiuti

Prima di Java, tutta la memoria del programma era gestita dal programmatore. In Java, la memoria del programma è gestita dalla JVM. La JVM gestisce la memoria attraverso un processo chiamato garbage collection , che identifica ed elimina continuamente la memoria inutilizzata nei programmi Java. La raccolta dei rifiuti avviene all'interno di una JVM in esecuzione.

All'inizio, Java è stato oggetto di molte critiche per non essere "vicino al metallo" come C ++, e quindi non così veloce. Il processo di raccolta dei rifiuti è stato particolarmente controverso. Da allora, una varietà di algoritmi e approcci sono stati proposti e utilizzati per la garbage collection. Con uno sviluppo e un'ottimizzazione coerenti, la raccolta dei rifiuti è notevolmente migliorata.

Cosa significa "vicino al metallo"?

Quando i programmatori dicono che un linguaggio di programmazione o una piattaforma è "vicino al metallo", intendiamo che lo sviluppatore è in grado di gestire in modo programmatico (scrivendo codice) la memoria di un sistema operativo. In teoria, i programmatori possono ottenere maggiori prestazioni dai nostri programmi stabilendo quanto viene utilizzato e quando scartarlo. Nella maggior parte dei casi, delegare la gestione della memoria a un processo altamente raffinato come la JVM produce prestazioni migliori e meno errori rispetto a farlo da soli.

La JVM in tre parti

Si potrebbe dire che ci sono tre aspetti nella JVM: specifica, implementazione e istanza. Consideriamo ciascuno di questi.

1. La specifica JVM

Innanzitutto, la JVM è una specifica software. In modo un po 'circolare, la specifica JVM evidenzia che i suoi dettagli di implementazione non sono definiti all'interno della specifica, al fine di consentire la massima creatività nella sua realizzazione:

"Per implementare correttamente la macchina virtuale Java, è sufficiente essere in grado di leggere il classformato del file ed eseguire correttamente le operazioni ivi specificate."

JS Bach una volta ha descritto la creazione di musica in modo simile:

"Tutto quello che devi fare è toccare il tasto giusto al momento giusto."

Quindi, tutto ciò che la JVM deve fare è eseguire correttamente i programmi Java. Sembra semplice, potrebbe anche sembrare semplice dall'esterno, ma è un'impresa enorme, soprattutto data la potenza e la flessibilità del linguaggio Java.

La JVM come macchina virtuale

La JVM è una macchina virtuale che esegue i file di classe Java in modo portatile. Essere una macchina virtuale significa che la JVM è un'astrazione di una macchina reale sottostante, come il server su cui è in esecuzione il programma. Indipendentemente dal sistema operativo o dall'hardware effettivamente presente, la JVM crea un ambiente prevedibile in cui eseguire i programmi. A differenza di una vera macchina virtuale, tuttavia, la JVM non crea un sistema operativo virtuale. Sarebbe più accurato descrivere la JVM come un ambiente di runtime gestito o una macchina virtuale di processo .

2. Implementazioni JVM

L'implementazione della specifica JVM produce un vero e proprio programma software, che è un'implementazione JVM. In effetti, ci sono molte implementazioni JVM, sia open source che proprietarie. HotSpot JVM di OpenJDK è l'implementazione di riferimento e rimane una delle basi di codice più provate e testate al mondo. HotSpot è anche la JVM più comunemente utilizzata.

Quasi tutte le JVM con licenza vengono create come fork di OpenJDK e HotSpot JVM, incluso il JDK con licenza di Oracle. Gli sviluppatori che creano un fork con licenza di OpenJDK sono spesso motivati ​​dal desiderio di aggiungere miglioramenti delle prestazioni specifici del sistema operativo. In genere, si scarica e si installa la JVM come parte in bundle di un Java Runtime Environment (JRE).

3. Un'istanza JVM

Dopo che la specifica JVM è stata implementata e rilasciata come prodotto software, è possibile scaricarla ed eseguirla come programma. Quel programma scaricato è un'istanza (o una versione istanziata) della JVM.

Il più delle volte, quando gli sviluppatori parlano di "JVM", ci riferiamo a un'istanza JVM in esecuzione in un ambiente di sviluppo software o di produzione. Potresti dire: "Ehi Anand, quanta memoria sta utilizzando la JVM su quel server?" oppure "Non riesco a credere di aver creato una chiamata circolare e un errore di overflow dello stack ha bloccato la mia JVM. Che errore da principiante!"

Cos'è una specifica del software?

Una specifica software (o specifica) è un documento di progettazione leggibile dall'uomo che descrive come dovrebbe funzionare un sistema software. Lo scopo di una specifica è creare una descrizione chiara e requisiti per cui gli ingegneri devono codificare.

Caricamento ed esecuzione di file di classe nella JVM

Abbiamo parlato del ruolo della JVM nell'esecuzione di applicazioni Java, ma come svolge la sua funzione? Per eseguire le applicazioni Java, la JVM dipende dal programma di caricamento classi Java e da un motore di esecuzione Java.

Il programma di caricamento classi Java nella JVM

Tutto in Java è una classe e tutte le applicazioni Java sono costruite da classi. Un'applicazione potrebbe essere costituita da una o migliaia di classi. Per eseguire un'applicazione Java, una JVM deve caricare i file .class compilati in un contesto, come un server, dove è possibile accedervi. Una JVM dipende dal suo programma di caricamento classi per eseguire questa funzione.

Il programma di caricamento classi Java è la parte della JVM che carica le classi in memoria e le rende disponibili per l'esecuzione. I programmi di caricamento delle classi utilizzano tecniche come il caricamento lento e la memorizzazione nella cache per rendere il caricamento delle classi il più efficiente possibile. Detto questo, il caricamento della classe non è l'epico rompicapo che (diciamo) è la gestione della memoria in runtime portatile, quindi le tecniche sono relativamente semplici.

Ogni Java Virtual Machine include un programma di caricamento classi. La specifica JVM descrive i metodi standard per l'interrogazione e la manipolazione del programma di caricamento classi in fase di esecuzione, ma le implementazioni JVM sono responsabili dell'adempimento di queste capacità. Dal punto di vista dello sviluppatore, i meccanismi di caricamento classi sottostanti sono in genere una scatola nera.

Il motore di esecuzione nella JVM

Una volta che il programma di caricamento classi ha completato il suo lavoro di caricamento delle classi, la JVM inizia a eseguire il codice in ciascuna classe. Il motore di esecuzione è il componente JVM che gestisce questa funzione. Il motore di esecuzione è essenziale per la JVM in esecuzione. In effetti, per tutti gli scopi pratici, è l'istanza JVM.

L'esecuzione del codice implica la gestione dell'accesso alle risorse di sistema. Il motore di esecuzione JVM si trova tra il programma in esecuzione, con le sue richieste di risorse di file, rete e memoria, e il sistema operativo, che fornisce tali risorse.

In che modo il motore di esecuzione gestisce le risorse di sistema

Le risorse di sistema possono essere suddivise in due grandi categorie: memoria e tutto il resto.

Ricorda che la JVM è responsabile dell'eliminazione della memoria inutilizzata e che la garbage collection è il meccanismo che esegue tale eliminazione. La JVM è anche responsabile dell'allocazione e del mantenimento della struttura referenziale che lo sviluppatore dà per scontata. Ad esempio, il motore di esecuzione della JVM è responsabile di prendere qualcosa come la newparola chiave in Java e trasformarla in una richiesta specifica del sistema operativo per l'allocazione della memoria.

Oltre alla memoria, il motore di esecuzione gestisce le risorse per l'accesso al file system e l'I / O di rete. Poiché la JVM è interoperabile tra i sistemi operativi, questo non è un compito da poco. Oltre alle esigenze di risorse di ciascuna applicazione, il motore di esecuzione deve rispondere a ogni ambiente del sistema operativo. È così che la JVM è in grado di gestire le richieste in-the-wild.

Evoluzione di JVM: passato, presente, futuro

Nel 1995, la JVM ha introdotto due concetti rivoluzionari che da allora sono diventati la tariffa standard per lo sviluppo del software moderno: "Scrivi una volta, esegui ovunque" e la gestione automatica della memoria. L'interoperabilità del software era un concetto audace all'epoca, ma pochi sviluppatori oggi ci penserebbero due volte. Allo stesso modo, mentre i nostri antenati dell'ingegneria dovevano gestire da soli la memoria del programma, la mia generazione è cresciuta con la raccolta dei rifiuti.

Potremmo dire che James Gosling e Brendan Eich hanno inventato la programmazione moderna, ma migliaia di altri hanno perfezionato e sviluppato le loro idee nei decenni successivi. Mentre Java Virtual Machine era originariamente solo per Java, oggi si è evoluta per supportare molti linguaggi di scripting e programmazione, tra cui Scala, Groovy e Kotlin. Guardando al futuro, è difficile vedere un futuro in cui la JVM non sia una parte importante del panorama di sviluppo.

Tutto sulla JVM

  • Sfidanti Java: comportamento dei thread nella JVM
  • Sfidanti Java: sovraccarico del metodo nella JVM
  • Ottimizzazione delle prestazioni all'interno di JVM
  • Nozioni di base sul bytecode: come la JVM gestisce il bytecode
  • Eccezioni Java: come la JVM gestisce le eccezioni
  • Presentazione della macchina virtuale snella e media di Java

Questa storia, "Cos'è la JVM? Presentazione della Java Virtual Machine" è stata originariamente pubblicata da JavaWorld.