Java Virtual Machine (JVM) er en kjernekomponent i Java Runtime Environment (JRE) som lar Java-programmer kjøre på hvilken som helst plattform uten endringer. JVM fungerer som en tolk mellom Java-bytekode og den underliggende maskinvaren som gir Javas berømte WORA-funksjonalitet (Writ Once Run Anywhere).
- Java-kilde (.java) -> kompilert av javac -> bytekode (.class)
- JVM laster bytekoden bekrefter at den kobler den og kjører den deretter
- Utførelse kan innebære å tolke bytekode eller bruke Just-In-Time (JIT) kompilering for å konvertere hot code til innebygd maskinkode for ytelse
- Søppelsamling kjører i bakgrunnen for å gjenvinne minne fra ubrukte gjenstander
Arkitektur av JVM
Bildet nedenfor viser arkitekturen og nøkkelkomponentene til JVM.
Komponenter av JVM Architecture
Nå skal vi diskutere hver komponent i JVM i detalj.
1. Klasselasterundersystem
Den er i hovedsak ansvarlig for tre aktiviteter.
1. Lasting
- Leser .class-filer og lagrer klassemetadata i metodeområdet.
- Oppretter et klasseobjekt i haugen som representerer den innlastede klassen.
class GFG{ static{ System.out.println('GFG class is loaded by the JVM!'); } public void display(){ System.out.println('Method of GFG class is executed.'); } } public class Test{ public static void main(String[] args) throws Exception{ System.out.println('Main method started.'); // Loading the class explicitly using Class.forName() Class.forName('GFG'); System.out.println('Class loaded successfully.'); // Creating object to execute method GFG obj = new GFG(); obj.display(); } }
Produksjon
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.
Note: For hver lastet .klasse bare fil en objektet til klassen er opprettet.
2. Kobling: Ansvarlig for å klargjøre den lastede klassen for utførelse. Den inkluderer tre trinn:
- Bekreftelse: Sikrer at bytekoden følger JVM-regler og er trygg å kjøre.
- Preparat: Tildeler minne for statiske variabler og tildeler standardverdier.
- Oppløsning: Konverterer symbolske referanser til direkte referanser i minnet.
3. Initialisering
- Tildeler faktiske verdier til statiske variabler.
- Utfører statiske blokker definert i klassen.
Klasselastertyper
- Bootstrap Class Loader: Laster inn kjerne Java-klasser (JAVA_HOME/lib).
- Forlengelsesklasselaster: Laster klasser fra utvidelseskatalogen (JAVA_HOME/jre/lib/ext).
- System-/applikasjonsklasselaster: Laster klasser fra applikasjonens klassebane.
// Java code to demonstrate Class Loader subsystem public class Geeks { public static void main(String[] args) { // String class is loaded by bootstrap loader and // bootstrap loader is not Java object hence null System.out.println(String.class.getClassLoader()); // Test class is loaded by Application loader System.out.println(Geeks.class.getClassLoader()); } }
Produksjon
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
2. JVM-minneområder
- Metodeområde: Lagrer informasjon på klassenivå som klassenavn, overordnede klassemetodevariabler og statiske data. Delt på tvers av JVM.
- Heap Area: Lagrer alle objekter. Delt på tvers av JVM.
- Stabelområde: Hver tråd har sin egen runtime stack; lagrer metode kaller lokale variabler i stabelrammer. Ødelagt når tråden slutter.
- PC-registre: Hold adressen til den gjeldende instruksjonen for hver tråd.
- Innebygde metodestabler: Hver tråd har en egen stabel for kjøring av opprinnelig metode.
3. Utførelsesmotor
Utførelsesmotoren kjører .klassen (bytekode). Den leser byte-koden linje for linje bruker data og informasjon som finnes i forskjellige minneområder og utfører instruksjoner. Det kan deles inn i tre deler:
- Tolk: Den tolker bytekoden linje for linje og kjører deretter. Ulempen her er at når en metode kalles flere ganger hver gang det kreves tolkning.
- Just-in-time kompilator (JIT): Det brukes til å øke effektiviteten til en tolk. Den kompilerer hele bytekoden og endrer den til naturlig kode, så hver gang tolken ser gjentatte metodeanrop, gir JIT direkte innfødt kode for den delen, slik at nytolkning ikke er nødvendig, og effektiviteten forbedres.
- Søppelsamler: Det ødelegger ikke-refererte objekter. For mer om Garbage Collector se Søppelsamler .
4. Java Native Interface (JNI)
Det er et grensesnitt som samhandler med Native Method Libraries og gir de native bibliotekene (C C++) som kreves for kjøringen. Den gjør det mulig for JVM å kalle C/C++-biblioteker og bli kalt opp av C/C++-biblioteker som kan være spesifikke for maskinvare.
5. Native metodebiblioteker
Dette er samlinger av native biblioteker som kreves for å utføre native metoder. De inkluderer biblioteker skrevet på språk som C og C++.