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.
A JVM Architecture összetevői
Most részletesen tárgyaljuk a JVM egyes összetevőit.
java hello world példa
1. Osztálybetöltő alrendszer
Főleg három tevékenységért felelős.
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.
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álybetöltő 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 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
- 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ó:
e-r modell diagram
- 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.