logo

Hur JVM fungerar - JVM Architecture

Java Virtual Machine (JVM) är en kärnkomponent i Java Runtime Environment (JRE) som gör att Java-program kan köras på vilken plattform som helst utan ändringar. JVM fungerar som en tolk mellan Java-bytekod och den underliggande hårdvaran som tillhandahåller Javas berömda WORA-funktion (Writ Once Run Anywhere).

  • Java-källa (.java) -> kompilerad av javac -> bytekod (.class)
  • JVM laddar bytekoden verifierar att den länkar den och kör den sedan
  • Exekvering kan innebära tolkning av bytekod eller användning av just-in-time (JIT) kompilering för att konvertera hot code till inbyggd maskinkod för prestanda
  • Sophämtning körs i bakgrunden för att återta minnet från oanvända föremål

JVM:s arkitektur

Bilden nedan visar arkitekturen och nyckelkomponenterna i JVM.

Jvm' title=

Komponenter i JVM Architecture

Nu ska vi diskutera varje komponent i JVM i detalj.



1. Undersystem för klasslastare

Den ansvarar huvudsakligen för tre aktiviteter. 

class_loader_subsystem' loading='lazy' title=

1. Laddar

  • Läser .class-filer och lagrar klassmetadata i metodområdet.
  • Skapar ett klassobjekt i högen som representerar den laddade klassen.
Java
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. 

Notera: För varje laddad .klass endast fil en objektet för klassen skapas.

2. Länka: Ansvarig för att förbereda den laddade klassen för exekvering. Den innehåller tre steg:

  • Kontroll: Säkerställer att bytekoden följer JVM-regler och är säker att köra.
  • Förberedelse: Tilldelar minne för statiska variabler och tilldelar standardvärden.
  • Upplösning: Konverterar symboliska referenser till direkta referenser i minnet.

3. Initiering

  • Tilldelar faktiska värden till statiska variabler.
  • Kör statiska block definierade i klassen.

Klasslastartyper

  • Bootstrap Class Loader: Laddar grundläggande Java-klasser (JAVA_HOME/lib).
  • Förlängningsklasslastare: Laddar klasser från tilläggskatalogen (JAVA_HOME/jre/lib/ext).
  • System/applikationsklassladdare: Laddar klasser från applikationens klasssökväg.
Java
// 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-minnesområden

  • Metodområde: Lagrar information på klassnivå som klassnamnsvariabler för överordnade klassmetoder och statisk data. Delas över JVM.
  • Högområde: Lagrar alla objekt. Delas över JVM.
  • Stackområde: Varje tråd har sin egen runtime stack; lagrar metoden anropar lokala variabler i stackramar. Förstörs när tråden tar slut.
  • PC-register: Håll adressen till den instruktion som körs för närvarande för varje tråd.
  • Inbyggda metodstaplar: Varje tråd har en separat stack för exekvering av inbyggd metod.

3. Utförandemotor 

Exekveringsmotorn kör .class (bytecode). Den läser bytekoden rad för rad använder data och information som finns i olika minnesområden och exekverar instruktioner. Det kan delas in i tre delar:

  • Tolk: Den tolkar bytekoden rad för rad och körs sedan. Nackdelen här är att när en metod anropas flera gånger varje gång krävs tolkning.
  • Just-in-time kompilator (JIT): Det används för att öka effektiviteten hos en tolk. Den kompilerar hela bytekoden och ändrar den till inbyggd kod så närhelst tolken ser upprepade metodanrop tillhandahåller JIT direkt inbyggd kod för den delen så omtolkning krävs inte och effektiviteten förbättras.
  • Sophämtare: Det förstör objekt som inte hänvisas till. Se mer om Garbage Collector Sophämtare .

4. Java Native Interface (JNI)

Det är ett gränssnitt som interagerar med Native Method Libraries och tillhandahåller de inbyggda biblioteken (C C++) som krävs för exekveringen. Det gör det möjligt för JVM att anropa C/C++-bibliotek och att anropas av C/C++-bibliotek som kan vara specifika för hårdvara.

5. Native Method Libraries

Dessa är samlingar av inbyggda bibliotek som krävs för att köra inhemska metoder. De inkluderar bibliotek skrivna på språk som C och C++.