Különbség a JVM, a JRE és a JDK között

1. Áttekintés

Ebben a cikkben megvitatjuk a JVM, JRE és JDK közötti különbségeket, figyelembe véve azok összetevőit és felhasználását.

2. JVM

A Java Virtual Machine (JVM) egy virtuális gép megvalósítása, amely Java programot hajt végre.

A JVM először értelmezi a bájtkódot. Ezután eltárolja az osztály adatait a memória területén. Végül végrehajtja a java fordító által generált bájtkódot.

Ez egy absztrakt számítástechnikai gép, saját utasításkészlettel, és futás közben manipulálja a különféle memóriaterületeket.

A JVM elemei a következők:

  • Osztályos rakodók
  • Futásidejű adatterületek
  • Végrehajtó motor

2.1. Osztályos rakodók

A JVM kezdeti feladatai közé tartozik a bájtkód betöltése, ellenőrzése és összekapcsolása. Az osztályos rakodók kezelik ezeket a feladatokat.

Van egy részletes cikkünk, amely kifejezetten az osztályos rakodókról szól.

2.2. Futásidejű adatterületek

A JVM különféle memóriaterületeket határoz meg egy Java program futtatásához. Ezeket futás közben használják, és futásidejű adatterületekként ismerik őket. Ezen területek egy része a JVM indításakor jön létre, és megsemmisül, amikor a JVM kilép, míg egyesek akkor jönnek létre, amikor egy szál létrejön, és megsemmisül, amikor egy szál kilép.

Tekintsük ezeket a területeket egyenként:

Módszer Terület

Alapvetően a módszer területe analóg a lefordított kód tárterületével. Olyan struktúrákat tárol, mint a futásidejű állandó készlet, a mező és a módszer adatai, a módszerek és a konstruktorok kódja, valamint a teljesen minősített osztálynevek. A JVM ezeket a struktúrákat minden osztály számára tárolja.

A módszer terület, más néven állandó generációs tér (PermGen), a JVM indításakor jön létre. Ennek a területnek a memóriájának nem kell egybefüggőnek lennie. Az összes JVM-szál megosztja ezt a memóriaterületet.

Halomterület

A JVM lefoglalja a memóriát az összes osztálypéldánynak és tömbnek erről a területről.

A Garbage Collector (GC) visszakapja a halom memóriát az objektumok számára. Alapvetően a GC-nek három fázisa van, hogy visszanyerje a memóriát az objektumoktól, azaz. két kisebb GC és egy fő GC.

A halom memóriának három része van:

  • Eden Space - a Young Generation tér része. Amikor létrehozunk egy objektumot, a JVM lefoglalja a memóriát erről a térről
  • Túlélő űr - a Young Generation tér része is. A túlélő tér olyan meglévő tárgyakat tartalmaz, amelyek túlélték a GC kisebb GC fázisait
  • Bérelt hely - ez az Old Generation tér néven is ismert. Régóta fennmaradt tárgyakat tartogat. Alapvetően egy küszöböt állítanak be a Young Generation objektumokhoz, és amikor ez a küszöbérték teljesül, ezeket az objektumokat a bérelt helyre helyezik át.

A JVM halomterületet hoz létre, amint elindul. A JVM összes szála megosztja ezt a területet. A kupacterület memóriájának nem kell egybefüggőnek lennie.

Veremterület

Az adatokat keretekként tárolja, és minden egyes keret helyi változókat, részeredményeket és beágyazott metódushívásokat tárol. A JVM létrehozza a verem területét, amikor új szálat hoz létre. Ez a terület minden szálhoz privát.

A verem minden bejegyzését veremkeretnek vagy aktiválási rekordnak hívják. Minden keret három részt tartalmaz:

  • Helyi változó tömb - tartalmazza a módszer összes helyi változóját és paraméterét
  • Operand verem - munkaterületként használják a közbenső számítás eredményeinek tárolására
  • Keretadatok - részeredmények tárolására, a módszerek visszatérési értékeinek és a Kivétel táblázat, amely kivételek esetén a megfelelő fogási blokk információkat tartalmazza

A JVM-verem memóriájának nem kell egybefüggőnek lennie.

PC-regiszterek

Minden JVM-szál külön PC-regiszterrel rendelkezik, amely tárolja az éppen végrehajtott utasítás címét. Ha az éppen végrehajtott utasítás a natív módszer része, akkor ez az érték nincs meghatározva.

Natív módszer verem

A natív módszerek azok, amelyeket a Java-tól eltérő nyelveken írtak.

A JVM biztosítja ezeket a natív módszereket. A natív módszer halmozását „C halomnak” is nevezik. Tárolják a natív módszer adatait. Amikor a natív módszereket gépi kódokká fordítják, általában natív módszer verem segítségével követik nyomon az állapotukat.

A JVM létrehozza ezeket a veremeket, amikor új szálat hoz létre. Így a JVM szálai nem osztják ezt a területet.

2.3. Végrehajtó motor

A végrehajtó motor az utasításokat a memóriaterületeken található információk felhasználásával hajtja végre. Három részből áll:

Tolmács

Amint az osztálytervezők betöltik és ellenőrzik a bájtkódot, az értelmező soronként végrehajtja a bájtkódot. Ez a végrehajtás meglehetősen lassú. A tolmács hátránya, hogy amikor egy módszert többször hívnak meg, minden alkalommal új értelmezésre van szükség.

A JVM azonban a JIT Compiler programot használja e hátrány enyhítésére.

Just-In-Time (JIT) fordító

A JIT fordító futás közben natív kódba fordítja a gyakran hívott módszerek byte-kódját. Ezért felelős a Java programok optimalizálásáért.

A JVM automatikusan figyeli a végrehajtott módszereket. Amint egy módszer jogosult lesz a JIT-fordításra, azt ütemezik a gépi kódra történő fordításra. Ezt a módszert akkor meleg módszernek nevezik. Ez a gépi kódra történő fordítás külön JVM szálon történik.

Ennek eredményeként nem szakítja meg az aktuális program végrehajtását. A gépi kódra fordítás után gyorsabban fut.

Szemetes

A Java gondoskodik a memóriakezelésről a Garbage Collection segítségével. Ez egy halom memória vizsgálata, a használatban lévő és a nem használt objektumok azonosítása, végül a fel nem használt objektumok törlése.

A GC egy démonszál. Kifejezetten felhasználható Rendszer.gc() módszer azonban nem kerül azonnal végrehajtásra, és a JVM eldönti, hogy mikor hívja meg a GC-t.

2.4. Java natív interfész

Interfészként működik a Java-kód és a natív (C / C ++) könyvtárak között.

Vannak olyan helyzetek, amikor a Java önmagában nem felel meg az alkalmazás igényeinek, például platformfüggő funkciót valósít meg.

Ezekben az esetekben a JNI segítségével engedélyezhetjük a JVM-ben futó kód hívását. Ezzel szemben lehetővé teszi a natív módszereket a JVM-ben futó kód meghívására.

2.5. Natív könyvtárak

Ezek platformspecifikus könyvtárak, és tartalmazzák a natív módszerek megvalósítását.

3. JRE

A Java Runtime Environment (JRE) a Java-alkalmazások futtatásához használt szoftverösszetevőkből álló csomag.

A JRE fő elemei a következők:

  • Java virtuális gép (JVM) megvalósítása
  • A Java programok futtatásához szükséges osztályok
  • Tulajdoni fájlok

A JVM-et a fenti szakaszban tárgyaltuk. Itt az alaposztályokra és a támogatási fájlokra fogunk összpontosítani.

3.1. Bootstrap osztályok

Alatt találunk bootstrap osztályokat jre / lib /. Ez az út a bootstrap classpath néven is ismert. Magába foglalja:

  • Futásidejű órák itt: rt.jar
  • Nemzetközi nemzetiségi órák i18n.jar
  • Karakter-átalakítási osztályok karakterkészletek.jar
  • Mások

A Bootstrap ClassLoader ezeket az osztályokat tölti be, amikor a JVM elindul.

3.2. Bővítési osztályok

A kiterjesztési osztályokat itt találjuk jre / lib / extn / amely a Java platform kiterjesztéseinek könyvtáraként működik. Ez az út más néven kiterjesztésű osztályút.

A JavaFX futásidejű könyvtárakat tartalmazza jfxrt.jar és a területi adatok java.text és java.util csomagok localedata.jar. A felhasználók egyedi üvegeket is hozzáadhatnak ebbe a könyvtárba.

3.3. Tulajdonság beállításai

A Java platform ezeket a tulajdonságbeállításokat használja a konfiguráció fenntartásához. Használattól függően a belső mappákban találhatók / jre / lib /. Ezek tartalmazzák:

  • A naptár konfigurációi a naptár.tulajdonságok
  • Konfigurációk naplózása naplózás.tulajdonságok
  • Hálózati konfigurációk net.tulajdonságok
  • Telepítési tulajdonságok / jre / lib / deploy /
  • Kezelési tulajdonságok / jre / lib / management /

3.4. Egyéb fájlok

A JRE a fent említett fájlokon és osztályokon kívül más ügyek fájljait is tartalmazza:

  • Biztonságkezelés itt: jre / lib / security
  • A kisalkalmazások támogatási osztályainak elhelyezésére szolgáló könyvtár a jre / lib / applet
  • Betűkészlettel kapcsolatos fájlok itt: jre / lib / fonts és mások

4. JDK

A Java Development Kit (JDK) környezetet és eszközöket biztosít a Java programok fejlesztéséhez, fordításához, hibakereséséhez és futtatásához.

A JDK fő elemei a következők:

  • JRE
  • Fejlesztő eszközök

A JRE-t a fenti szakaszban tárgyaltuk.

Most különféle fejlesztési eszközökre fogunk összpontosítani. Csoportosítsuk ezeket az eszközöket felhasználásuk alapján:

4.1. Alapvető eszközök

Ezek az eszközök megalapozzák a JDK-t, és Java alkalmazások létrehozására és felépítésére szolgálnak. Ezen eszközök között megtalálhatunk segédprogramokat fordításhoz, hibakereséshez, archiváláshoz, Javadocsok előállításához stb.

Tartalmazzák:

  • javac - beolvassa az osztály és az interfész definícióit, és osztályfájlokká állítja össze őket
  • java - elindítja a Java alkalmazást
  • javadoc - Java forrásfájlokból generálja az API dokumentáció HTML oldalait
  • apt - megkeresi és végrehajtja az annotációs processzorokat a megadott forrásfájlok halmazában található annotációk alapján
  • appletviewer - lehetővé teszi számunkra a Java kisalkalmazások futtatását webböngésző nélkül
  • befőttes üveg - a Java kisalkalmazásokat vagy alkalmazásokat egyetlen archívumba csomagolja
  • jdb - parancssori hibakereső eszköz, amely a Java-alkalmazások hibáinak felkutatására és kijavítására szolgál
  • javah - C fejléc- és forrásfájlokat állít elő egy Java osztályból
  • javap - szétszedi az osztályfájlokat, és információkat jelenít meg az osztályfájlban található mezőkről, konstruktorokról és módszerekről
  • extcheck - verziókonfliktusokat észlel a Java Java Archive (JAR) fájl és a jelenleg telepített kiterjesztésű JAR fájlok között

4.2. Biztonsági eszközök

Ide tartoznak a kulcs- és tanúsítványkezelő eszközök, amelyek a Java kulcstárak manipulálására szolgálnak.

A Java kulcstároló az engedélyezési tanúsítványok vagy a nyilvános kulcsú tanúsítványok tárolója. Következésképpen a Java-alapú alkalmazások gyakran használják titkosításhoz, hitelesítéshez és HTTPS-en keresztüli kiszolgáláshoz.

Ezenkívül elősegítik rendszerünk biztonsági házirendjeinek beállítását és olyan alkalmazások létrehozását, amelyek a házirend hatálya alá tartozhatnak a termelési környezetben. Ezek tartalmazzák:

  • kulcstartó - segít a kulcstár bejegyzések, nevezetesen a kriptográfiai kulcsok és tanúsítványok kezelésében
  • jarrsigner - digitálisan aláírt JAR fájlokat generál a kulcstár információ felhasználásával
  • rendszertan - lehetővé teszi számunkra a külső házirend-konfigurációs fájlok kezelését, amelyek meghatározzák a telepítés biztonsági házirendjét

Néhány biztonsági eszköz segít a Kerberos jegyek kezelésében is.

A Kerberos egy hálózati hitelesítési protokoll.

Jegyek alapján működik, hogy a nem biztonságos hálózaton keresztül kommunikáló csomópontok biztonságos módon igazolhassák identitásukat egymásnak:

  • kinit - Kerberos jegykiadó jegyek megszerzéséhez és gyorsítótárba helyezéséhez használták
  • ktab - kezeli az alapneveket és a kulcspárokat a kulcstáblában
  • klist - megjeleníti a bejegyzéseket a helyi hitelesítő adatok gyorsítótárában és kulcstáblájában

4.3. Nemzetközi eszköz

A nemzetközivé válás egy olyan alkalmazás megtervezésének folyamata, amely mérnöki változtatások nélkül alkalmazható a különböző nyelvekhez és régiókhoz.

Erre a célra a JDK hozza native2ascii. Ez az eszköz a JRE által támogatott karakterekkel rendelkező fájlt konvertálja az ASCII kódolású fájlokká, vagy az Unicode Escape.

4.4. Távoli módszer meghívás (RMI) eszközök

Az RMI eszközök lehetővé teszik a távoli kommunikációt a Java alkalmazások között, ezáltal teret engedve az elosztott alkalmazások fejlesztésének.

Az RMI lehetővé teszi, hogy az egyik JVM-ben futó objektum metódusokat hívjon meg egy másik JVM-ben futó objektumon. Ezek az eszközök a következők:

  • rmic - csonk, csontváz és nyakkendő osztályokat generál távoli objektumokhoz a Java Remote Method Protocol (JRMP) vagy az Internet Inter-Orb Protocol (IIOP) segítségével
  • rmiregistry - létrehozza és elindítja a távoli objektum-nyilvántartást
  • rmid - start az aktiváló rendszer démonját. Ez lehetővé teszi az objektumok regisztrálását és aktiválását egy Java virtuális gépben
  • serialver - A megadott osztályok UID soros verzióját adja vissza

4.5. Java IDL és RMI-IIOP eszközök

A Java Interface Definition Language (IDL) általános objektum-alapú kérésközvetítő architektúra (CORBA) képességet ad hozzá a Java platformhoz.

Ezek az eszközök lehetővé teszik az elosztott Java webalkalmazások számára a távoli hálózati szolgáltatások műveleteinek meghívását az ipari szabványos Object Management Group (OMG) - IDL segítségével.

Hasonlóképpen használhatnánk az Internet InterORB Protocol (IIOP) protokollt is.

Az RMI-IIOP, azaz az IIOP feletti RMI lehetővé teszi a CORBA szerverek és alkalmazások programozását az RMI API-n keresztül. Ez lehetővé teszi a kapcsolatot két, bármely CORBA-kompatibilis nyelven írt alkalmazás között az Internet InterORB Protocol (IIOP) segítségével.

Ezek az eszközök a következők:

  • tnameserv - átmeneti elnevezési szolgáltatás, amely faszerkezetű könyvtárat biztosít az objektum hivatkozásokhoz
  • idlj - az IDL-Java fordító egy meghatározott IDL-fájl Java-összerendelésének előállításához
  • orbd - lehetővé teszi az ügyfelek számára, hogy átlátszó módon megtalálják és meghívják a szerveren lévő állandó objektumokat a CORBA környezetben
  • kiszolgálóeszköz - parancssori felületet biztosít a perzisztens kiszolgáló regisztrációjához vagy regisztrációjának törléséhez az ORB Daemon (orbd), indítsa el és állítsa le az ORB Daemon stb. által regisztrált állandó kiszolgálót

4.6. Java telepítési eszközök

Ezek az eszközök segítenek a Java alkalmazások és kisalkalmazások weben történő telepítésében. Tartalmazzák:

  • pack200 - átalakítja a JAR fájlt a-vá 200 csomag fájlt a Java segítségével gzip kompresszor
  • unpack200 - átalakul 200 csomag fájl JAR fájlba

4.7. Java Plug-in eszköz

A JDK biztosítja számunkra htmlkonverter. Ezenkívül a Java beépülő modullal együtt használják.

Egyrészt a Java Plug-in kapcsolatot létesít a népszerű böngészők és a Java platform között. Ennek a kapcsolatnak a eredményeként a webhely kisalkalmazásai böngészőben futtathatók.

Másrészről, htmlkonverter segédprogram egy kisalkalmazásokat tartalmazó HTML oldal konvertálására Java Plug-in formátumra.

4.8. Java Web Start eszköz

JDK hozza pofák. Használhatjuk a Java Web Start programmal együtt.

Ez az eszköz lehetővé teszi számunkra a Java alkalmazások letöltését és elindítását egyetlen kattintással a böngészőből. Ezért nincs szükség telepítési folyamat futtatására.

4.9. Monitoring és menedzsment eszközök

Ezek nagyszerű eszközök, amelyekkel figyelemmel kísérhetjük a JVM teljesítményét és az erőforrás-felhasználást. Íme néhány ezek közül:

  • jconsole - egy grafikus konzolt biztosít, amely lehetővé teszi a Java alkalmazások figyelemmel kísérését és kezelését
  • jps - felsorolja a műszerezett JVM-eket a célrendszeren
  • jstat - figyelemmel kíséri a JVM statisztikáit
  • jstatd - figyelemmel kíséri a műszeres JVM-ek létrehozását és megszüntetését

4.10. Hibaelhárító eszközök

Ezek olyan kísérleti eszközök, amelyeket felhasználhatunk a hibaelhárítási feladatokhoz:

  • info - konfigurációs információkat generál egy meghatározott Java folyamathoz
  • jmap - kinyomtatja a megosztott objektum memória térképeket vagy a halom memória részleteit egy megadott folyamatról
  • jsadebugd - csatolódik egy Java folyamathoz és hibakereső szerverként működik
  • jstack - kinyomtatja a Java szálak Java-nyomait egy adott Java-folyamathoz

5. Következtetés

Ebben a cikkben azonosítottuk, hogy a JVM, a JRE és a JDK közötti alapvető különbség a használatukban rejlik.

Először leírtuk, hogy a JVM egy absztrakt számítástechnikai gép, amely valóban végrehajtja a Java byte-kódot.

Ezután elmagyaráztuk, hogyan lehet csak futtatni a Java alkalmazásokat, használjuk a JRE-t.

Végül megértettük a Java alkalmazások fejlesztését, a JDK-t használjuk.

Szükségünk volt egy kis időre, hogy átkutassuk ennek az alkotóelemnek az eszközeit és alapvető fogalmait.