logo

Cum funcționează JVM - Arhitectura JVM

Java Virtual Machine (JVM) este o componentă de bază a Java Runtime Environment (JRE) care permite programelor Java să ruleze pe orice platformă fără modificări. JVM acționează ca un interpret între codul octet Java și hardware-ul de bază, oferind faimoasa capacitate Write Once Run Anywhere (WORA) a Java.

  • Sursă Java (.java) -> compilat de javac -> bytecode (.class)
  • JVM încarcă bytecode-ul verifică că îl leagă și apoi îl execută
  • Execuția poate implica interpretarea codului de octeți sau utilizarea compilării Just-In-Time (JIT) pentru a converti codul cald în cod nativ de mașină pentru performanță
  • Colectarea gunoiului rulează în fundal pentru a recupera memoria de la obiectele neutilizate

Arhitectura JVM

Imaginea de mai jos demonstrează arhitectura și componentele cheie ale JVM.

Jvm' title=

Componentele arhitecturii JVM

Acum vom discuta în detaliu fiecare componentă a JVM-ului.



instanță java a

1. Subsistem de încărcare de clasă

Este responsabil în principal pentru trei activități. 

subsistem_încărcare_clasă' loading='lazy' title=

1. Încărcare

  • Citește fișierele .class și stochează metadatele clasei în Zona Metodă.
  • Creează un obiect Class în heap reprezentând clasa încărcată.
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();  } } 

Ieșire
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed. 

Nota: Pentru fiecare încărcat .clasă numai fisierul unul este creat obiectul clasei.

2. Legătura: Responsabil cu pregătirea clasei încărcate pentru execuție. Acesta include trei pași:

piton sau
  • Verificare: Se asigură că bytecode urmează regulile JVM și este sigur de executat.
  • Preparare: Aloca memorie pentru variabilele statice și atribuie valori implicite.
  • Rezoluţie: Convertește referințele simbolice în referințe directe în memorie.

3. Inițializarea

  • Atribuie valori reale variabilelor statice.
  • Execută blocuri statice definite în clasă.

Tipuri de încărcător de clasă

  • Bootstrap Class Loader: Încarcă clasele principale Java (JAVA_HOME/lib).
  • Încărcător de clasă de extensie: Încarcă clase din directorul de extensii (JAVA_HOME/jre/lib/ext).
  • Încărcător de clasă de sistem/aplicație: Încarcă clase din calea clasei aplicației.
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());  } } 

Ieșire
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f 

2. Zone de memorie JVM

  • Zona metodei: Stochează informații la nivel de clasă precum numele clasei, variabilele metodelor clasei părinte și date statice. Partajat în JVM.
  • Zona Heap: Stochează toate obiectele. Partajat în JVM.
  • Zona stivei: Fiecare thread are propriul său stack de rulare; metoda stores apelează variabile locale în cadre de stivă. Distrus când firul se termină.
  • Registre PC: Țineți adresa instrucțiunii care se execută în prezent pentru fiecare fir.
  • Stive de metode native: Fiecare thread are o stivă separată pentru executarea metodei native.

3. Motor de execuție 

Motorul de execuție execută .class (bytecode). Citește codul octet, linie cu linie, utilizează date și informații prezente în diferite zone de memorie și execută instrucțiuni. Poate fi clasificat în trei părți:

unghiuri adiacente
  • Interpret: Acesta interpretează bytecode linie cu linie și apoi se execută. Dezavantajul aici este că atunci când o metodă este apelată de mai multe ori de fiecare dată când este necesară interpretarea.
  • Compilator Just-In-Time (JIT): Este folosit pentru a crește eficiența unui interpret. Compilează întregul bytecode și îl schimbă în cod nativ, astfel încât, ori de câte ori interpretul vede apeluri repetate de metodă, JIT oferă cod nativ direct pentru acea parte, astfel încât reinterpretarea nu este necesară, astfel eficiența este îmbunătățită.
  • Colector de gunoi: Distruge obiectele nereferite. Pentru mai multe despre Garbage Collector consultați Colector de gunoi .

4. Interfață nativă Java (JNI)

Este o interfață care interacționează cu Native Method Libraries și oferă bibliotecile native (C C++) necesare execuției. Acesta permite JVM să apeleze biblioteci C/C++ și să fie apelat de bibliotecile C/C++ care pot fi specifice hardware-ului.

5. Biblioteci cu metode native

Acestea sunt colecții de biblioteci native necesare pentru executarea metodelor native. Acestea includ biblioteci scrise în limbaje precum C și C++.