Java Virtual Machine (JVM) er en kernekomponent i Java Runtime Environment (JRE), der tillader Java-programmer at køre på enhver platform uden ændringer. JVM fungerer som en fortolker mellem Java-bytekode og den underliggende hardware, der giver Javas berømte WORA-funktion (Writ Once Run Anywhere).
- Java-kilde (.java) -> kompileret af javac -> bytekode (.class)
- JVM indlæser bytekoden bekræfter, at den forbinder den og udfører den derefter
- Udførelse kan involvere fortolkning af bytekode eller brug af JIT-kompilering (Just-In-Time) til at konvertere hot-kode til indbygget maskinkode for ydeevne
- Affaldsopsamling kører i baggrunden for at genvinde hukommelsen fra ubrugte genstande
JVM's arkitektur
Billedet nedenfor viser arkitekturen og nøglekomponenterne i JVM.
Komponenter af JVM Architecture
Nu skal vi diskutere hver komponent i JVM i detaljer.
1. Klasse Loader Subsystem
Den er hovedsagelig ansvarlig for tre aktiviteter.
1. Indlæsning
- Læser .class-filer og gemmer klassemetadata i metodeområdet.
- Opretter et klasseobjekt i heapen, der repræsenterer den indlæste klasse.
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(); } }
Produktion
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.
Note: For hver læsset .klasse kun fil en klassens objekt er oprettet.
2. Linkning: Ansvarlig for klargøring af den indlæste klasse til udførelse. Det omfatter tre trin:
- Verifikation: Sikrer, at bytekoden følger JVM-reglerne og er sikker at udføre.
- Forberedelse: Tildeler hukommelse til statiske variable og tildeler standardværdier.
- Opløsning: Konverterer symbolske referencer til direkte referencer i hukommelsen.
3. Initialisering
- Tildeler faktiske værdier til statiske variable.
- Udfører statiske blokke defineret i klassen.
Klasse Loader typer
- Bootstrap Class Loader: Indlæser kerne Java-klasser (JAVA_HOME/lib).
- Udvidelsesklasse-loader: Indlæser klasser fra udvidelsesmappen (JAVA_HOME/jre/lib/ext).
- System/applikationsklasseindlæser: Indlæser klasser fra applikationens klassesti.
// 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()); } }
Produktion
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
2. JVM-hukommelsesområder
- Metodeområde: Gemmer information på klasseniveau, som f.eks. klassenavn, overordnede klassemetodevariabler og statiske data. Delt på tværs af JVM.
- Heap område: Gemmer alle objekter. Delt på tværs af JVM.
- Stakområde: Hver tråd har sin egen runtime stack; lagrer metode kalder lokale variabler i stak frames. Ødelagt når tråden slutter.
- PC registre: Hold adressen på den aktuelt udførende instruktion for hver tråd.
- Native metodestakke: Hver tråd har en separat stak til native metodeudførelse.
3. Udførelsesmotor
Eksekveringsmotoren udfører .klassen (bytekode). Den læser byte-koden linje for linje bruger data og information til stede i forskellige hukommelsesområder og udfører instruktioner. Det kan opdeles i tre dele:
- Tolk: Den fortolker bytekoden linje for linje og udfører derefter. Ulempen her er, at når en metode kaldes flere gange, hver gang er fortolkning påkrævet.
- Just-In-Time Compiler (JIT): Det bruges til at øge effektiviteten af en tolk. Den kompilerer hele bytekoden og ændrer den til indbygget kode, så hver gang fortolkeren ser gentagne metodekald, leverer JIT direkte indbygget kode for den del, så genfortolkning er ikke påkrævet, så effektiviteten forbedres.
- Skraldeopsamler: Det ødelægger ikke-refererede objekter. Se mere om Garbage Collector Skraldesamler .
4. Java Native Interface (JNI)
Det er en grænseflade, der interagerer med Native Method Libraries og leverer de native biblioteker (C C++), der kræves til udførelsen. Det gør det muligt for JVM at kalde C/C++-biblioteker og blive kaldt af C/C++-biblioteker, som kan være specifikke for hardware.
5. Native metodebiblioteker
Disse er samlinger af native biblioteker, der er nødvendige for at udføre native metoder. De inkluderer biblioteker skrevet på sprog som C og C++.