logo

Miten JVM toimii - JVM-arkkitehtuuri

Java Virtual Machine (JVM) on Java Runtime Environmentin (JRE) ydinkomponentti, jonka avulla Java-ohjelmat voivat toimia millä tahansa alustalla ilman muutoksia. JVM toimii tulkkina Java-tavukoodin ja taustalla olevan laitteiston välillä ja tarjoaa Javan kuuluisan Write Once Run Anywhere (WORA) -ominaisuuden.

  • Java-lähde (.java) -> kääntänyt javac -> tavukoodi (.class)
  • JVM lataa tavukoodin, varmistaa, että se linkittää sen ja suorittaa sen sitten
  • Suoritukseen voi sisältyä tavukoodin tulkinta tai JIT-käännöksen käyttö kuuman koodin muuntamiseksi alkuperäiseksi konekoodiksi suorituskyvyn parantamiseksi.
  • Roskakeräys toimii taustalla, jotta käyttämättömät kohteet keräävät muistia

JVM:n arkkitehtuuri

Alla oleva kuva esittelee JVM:n arkkitehtuuria ja avainkomponentteja.

Jvm' title=

JVM-arkkitehtuurin komponentit

Nyt aiomme keskustella jokaisesta JVM:n komponentista yksityiskohtaisesti.



1. Class Loader Subsystem

Se vastaa pääasiassa kolmesta toiminnasta. 

class_loader_alijärjestelmä' loading='lazy' title=

1. Ladataan

if-lause java
  • Lukee .class-tiedostoja ja tallentaa luokan metatiedot Method Area -alueelle.
  • Luo luokka-objektin ladattua luokkaa edustavaan kasaan.
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();  } } 

Lähtö
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed. 

Huomautus: Jokaiselle ladatuksi .luokka vain tiedosto yksi luokan objekti luodaan.

2. Linkittäminen: Vastaa ladatun luokan valmistelusta suoritusta varten. Se sisältää kolme vaihetta:

  • Vahvistus: Varmistaa, että tavukoodi noudattaa JVM-sääntöjä ja on turvallista suorittaa.
  • Valmistelu: Varaa muistia staattisille muuttujille ja määrittää oletusarvot.
  • Resoluutio: Muuntaa symboliset viittaukset suoriksi viittauksiksi muistissa.

3. Alustus

  • Määrittää todelliset arvot staattisille muuttujille.
  • Suorittaa luokassa määritellyt staattiset lohkot.

Luokkakuormaajatyypit

  • Bootstrap Class Loader: Lataa Java-ydinluokat (JAVA_HOME/lib).
  • Laajennusluokan latausohjelma: Lataa luokat laajennushakemistosta (JAVA_HOME/jre/lib/ext).
  • Järjestelmä/sovellusluokan latausohjelma: Lataa luokat sovelluksen luokkapolusta.
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());  } } 

Lähtö
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f 

2. JVM-muistialueet

  • Menetelmäalue: Tallentaa luokkatason tietoja, kuten luokan nimen yläluokan menetelmämuuttujat ja staattiset tiedot. Jaettu JVM:ssä.
  • Kasan alue: Tallentaa kaikki esineet. Jaettu JVM:ssä.
  • Pinoalue: Jokaisella säikeellä on oma ajonaikainen pinonsa; tallentaa menetelmäkutsut paikalliset muuttujat pinokehyksiin. Tuhoutuu, kun lanka päättyy.
  • PC-rekisterit: Säilytä kullekin säikeelle parhaillaan suoritettavan käskyn osoite.
  • Alkuperäiset menetelmäpinot: Jokaisella säikeellä on erillinen pino alkuperäisen menetelmän suorittamista varten.

3. Suoritusmoottori 

Suoritusmoottori suorittaa .luokan (tavukoodin). Se lukee tavukoodin rivi riviltä, ​​käyttää eri muistialueella olevia tietoja ja suorittaa ohjeita. Se voidaan jakaa kolmeen osaan:

  • Tulkki: Se tulkitsee tavukoodin rivi riviltä ja suorittaa sen sitten. Haittana tässä on se, että kun yhtä menetelmää kutsutaan useita kertoja joka kerta, kun tulkintaa tarvitaan.
  • Just-In-Time-kääntäjä (JIT): Sitä käytetään tulkin tehokkuuden lisäämiseen. Se kokoaa koko tavukoodin ja muuttaa sen alkuperäiseksi koodiksi, joten aina kun tulkki näkee toistuvia menetelmäkutsuja, JIT tarjoaa suoran alkuperäisen koodin tälle osalle, joten uudelleentulkintaa ei tarvita, jolloin tehokkuus paranee.
  • Roskien kerääjä: Se tuhoaa kohteet, joihin ei ole viitattu. Lisätietoja Garbage Collectorista on osoitteessa Roskien kerääjä .

4. Java Native Interface (JNI)

Se on käyttöliittymä, joka on vuorovaikutuksessa Native Method -kirjastojen kanssa ja tarjoaa suorittamiseen tarvittavat alkuperäiset kirjastot (C C++). Sen avulla JVM voi kutsua C/C++-kirjastoja ja C/C++-kirjastoja, jotka voivat olla laitteistokohtaisia.

5. Native Method -kirjastot

Nämä ovat natiivikirjastojen kokoelmia, joita tarvitaan alkuperäisten menetelmien suorittamiseen. Ne sisältävät kirjastoja, jotka on kirjoitettu kielillä, kuten C ja C++.