Hogyan működik a JVM – JVM architektúra

Hogyan működik a JVM – JVM architektúra

A Java Virtual Machine (JVM) a Java Runtime Environment (JRE) alapvető összetevője, amely lehetővé teszi a Java programok bármilyen platformon történő módosítás nélküli futtatását. A JVM tolmácsként működik a Java bájtkód és a mögöttes hardver között, amely biztosítja a Java híres Write Once Run Anywhere (WORA) képességét.

  • Java forrás (.java) -> javac fordítása -> bájtkód (.class)
  • A JVM betölti a bájtkódot, ellenőrzi, hogy összekapcsolja-e, majd végrehajtja
  • A végrehajtás magában foglalhatja a bájtkód értelmezését vagy a Just-In-Time (JIT) fordítást a forró kód natív gépi kódká alakításához a teljesítmény érdekében.
  • A szemétgyűjtés a háttérben fut, hogy visszanyerje a memóriát a nem használt objektumokból

A JVM építészete

Az alábbi kép a JVM architektúráját és kulcsfontosságú összetevőit mutatja be.

Jvm

A JVM Architecture összetevői

Most részletesen tárgyaljuk a JVM egyes összetevőit.

1. Osztálybetöltő alrendszer

Főleg három tevékenységért felelős. 

osztálybetöltő_alrendszer

1. Betöltés

  • Beolvassa a .class fájlokat és tárolja az osztály metaadatait a Method Area területen.
  • Létrehoz egy osztály objektumot a kupacban, amely a betöltött osztályt képviseli.
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  ();      }   }   

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

Jegyzet: Minden feltöltöttnél .osztály csak fájl egy az osztály objektuma létrejön.

2. Összekapcsolás: Felelős a betöltött osztály végrehajtásra való felkészítéséért. Három lépést tartalmaz:

  • Ellenőrzés: Biztosítja, hogy a bájtkód megfeleljen a JVM-szabályoknak, és biztonságos legyen a végrehajtása.
  • Készítmény: Memóriát foglal le a statikus változóknak, és alapértelmezett értékeket rendel hozzá.
  • Felbontás: A szimbolikus hivatkozásokat közvetlen hivatkozásokká alakítja a memóriában.

3. Inicializálás

  • Valódi értékeket rendel a statikus változókhoz.
  • Végrehajtja az osztályban meghatározott statikus blokkokat.

Osztályrakodó típusok

  • Bootstrap osztálybetöltő: Betölti az alapvető Java osztályokat (JAVA_HOME/lib).
  • Kiterjesztési osztály betöltő: Osztályokat tölt be a bővítmények könyvtárából (JAVA_HOME/jre/lib/ext).
  • Rendszer/alkalmazásosztály betöltő: Osztályokat tölt be az alkalmazás osztályútvonaláról.
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  ());      }   }   

Kimenet
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f  

2. JVM memóriaterületek

  • A módszer területe: Osztályszintű információkat tárol, például osztálynév szülő osztálymetódus-változókat és statikus adatokat. Megosztva a JVM-en.
  • Halom területe: Minden objektumot tárol. Megosztva a JVM-en.
  • Stack terület: Minden szálnak megvan a maga futásidejű verem; a metódushívásokat veremkeretekben tárolja. Megsemmisül, amikor a szál véget ér.
  • PC regisztrációk: Tartsa meg az aktuálisan végrehajtott utasítás címét minden szálhoz.
  • Natív metódushalmok: Minden szálnak külön verem van a natív metódusok végrehajtásához.

3. Végrehajtó motor 

A végrehajtó motor végrehajtja a .class (bytecode) kódot. Soronként olvassa be a bájtkódot, felhasználja a különböző memóriaterületeken található adatokat és információkat, és utasításokat hajt végre. Három részre osztható:

  • Tolmács: Soronként értelmezi a bájtkódot, majd végrehajtja. Ennek az a hátránya, hogy amikor egy metódust többször is meghívnak, minden alkalommal, amikor értelmezésre van szükség.
  • Just-In-Time fordító (JIT): A tolmácsok hatékonyságának növelésére szolgál. A teljes bájtkódot lefordítja és natív kódra változtatja, így amikor az értelmező ismétlődő metódushívásokat lát, a JIT közvetlen natív kódot biztosít az adott részhez, így nincs szükség újraértelmezésre, így a hatékonyság javul.
  • Szemétgyűjtő: Megsemmisíti a nem hivatkozott objektumokat. A szemétgyűjtőről bővebben itt olvashat Szemétgyűjtő .

4. Java natív interfész (JNI)

Ez egy interfész, amely együttműködik a Native Method Libraries-ekkel, és biztosítja a végrehajtáshoz szükséges natív könyvtárakat (C C++). Lehetővé teszi, hogy a JVM C/C++ könyvtárakat hívjon, és C/C++ könyvtárak hívják, amelyek hardverspecifikusak lehetnek.

5. Natív módszerkönyvtárak

Ezek a natív metódusok végrehajtásához szükséges natív könyvtárak gyűjteményei. Ezek közé tartoznak a C és C++ nyelveken írt könyvtárak.


Kvíz létrehozása