Rozdiel medzi JVM, JRE a JDK

1. Prehľad

V tomto článku rozoberieme rozdiely medzi JVM, JRE a JDK zvážením ich komponentov a použití.

2. JVM

Java Virtual Machine (JVM) je implementácia virtuálneho stroja, ktorý vykonáva program Java.

JVM najskôr interpretuje bajtkód. Potom uloží informácie o triede do oblasti pamäte. Nakoniec vykoná bytecode vygenerovaný kompilátorom java.

Je to abstraktný výpočtový stroj s vlastnou inštrukčnou sadou a za behu manipuluje s rôznymi oblasťami pamäte.

Komponenty JVM sú:

  • Nakladače triedy
  • Dátové oblasti za behu
  • Vykonávací modul

2.1. Nakladače triedy

Počiatočné úlohy JVM zahŕňajú načítanie, overenie a prepojenie bytového kódu. Tieto úlohy zvládajú nakladače triedy.

Máme podrobný článok špeciálne o triednych nakladačoch.

2.2. Dátové oblasti za behu

JVM definuje rôzne oblasti pamäte na vykonávanie programu Java. Používajú sa počas behu programu a sú známe ako dátové oblasti za behu. Niektoré z týchto oblastí sú vytvorené pri spustení JVM a zničené pri ukončení JVM, zatiaľ čo niektoré sú vytvorené pri vytvorení vlákna a zničené pri ukončení vlákna.

Uvažujme postupne tieto oblasti:

Oblasť metódy

Oblasť metódy je v zásade obdobná ako oblasť úložiska pre kompilovaný kód. Ukladá štruktúry, ako napríklad fond konštantných za behu, údaje o poliach a metódach, kód metód a konštruktorov, ako aj plne kvalifikované názvy tried. JVM ukladá túto štruktúru pre každú triedu.

Oblasť metódy, známa tiež ako priestor stálej generácie (PermGen), sa vytvorí pri spustení JVM. Pamäť pre túto oblasť nemusí byť súvislá. Túto oblasť pamäte zdieľajú všetky vlákna JVM.

Halda oblasť

JVM vyhradzuje pamäť pre všetky inštancie triedy a polia z tejto oblasti.

Garbage Collector (GC) získava haldy pamäte pre objekty. GC má v zásade tri fázy na získanie pamäte z objektov, viď. dve menšie GC a jedna veľká GC.

Halda má tri časti:

  • Eden Space - je súčasťou vesmíru mladej generácie. Keď vytvárame objekt, JVM alokuje pamäť z tohto priestoru
  • Survivor Space - je tiež súčasťou vesmíru mladej generácie. Priestor pre preživších obsahuje existujúce objekty, ktoré prežili menšie fázy GC GC
  • Tenured Space - je tiež známy ako priestor starej generácie. Drží dlho prežívajúce predmety. V zásade je pre objekty mladej generácie nastavená prahová hodnota a keď je táto prahová hodnota splnená, tieto objekty sa presunú do trvalého priestoru.

JVM vytvorí oblasť haldy hneď po spustení. Všetky vlákna JVM zdieľajú túto oblasť. Pamäť pre oblasť haldy nemusí byť súvislá.

Stohovacia plocha

Ukladá údaje ako rámce a každý rámec ukladá lokálne premenné, čiastočné výsledky a vnorené volania metód. JVM vytvorí oblasť zásobníka vždy, keď vytvorí nové vlákno. Táto oblasť je súkromná pre každé vlákno.

Každá položka v zásobníku sa nazýva Stack Frame alebo Activation record. Každý rám obsahuje tri časti:

  • Pole miestnych premenných - obsahuje všetky miestne premenné a parametre metódy
  • Zásobník Operand - slúži ako pracovný priestor na ukladanie výsledkov medzivýpočtu
  • Údaje rámu - používajú sa na ukladanie čiastkových výsledkov, návratových hodnôt pre metódy a odkazu na Výnimka tabuľka, ktorá poskytuje príslušné informácie o bloku úlovku v prípade výnimiek

Pamäť pre zásobník JVM nemusí byť súvislá.

Registre PC

Každé vlákno JVM má samostatný register PC, v ktorom je uložená adresa práve prebiehajúcej inštrukcie. Pokiaľ je práve vykonávaná inštrukcia súčasťou natívnej metódy, potom je táto hodnota nedefinovaná.

Natívna metóda komíny

Natívne metódy sú tie, ktoré sú napísané v iných jazykoch ako Java.

JVM poskytuje možnosti volania týchto natívnych metód. Zásobníky natívnej metódy sú tiež známe ako „zásobníky C“. Ukladajú informácie o natívnej metóde. Kedykoľvek sú natívne metódy kompilované do strojových kódov, zvyčajne používajú zásobník natívnych metód na sledovanie svojho stavu.

Spoločný podnik JVM vytvára tieto stohy vždy, keď vytvára nové vlákno. A teda vlákna JVM nezdieľajú túto oblasť.

2.3. Vykonávací modul

Execution engine vykonáva inštrukcie pomocou informácií nachádzajúcich sa v pamäťových oblastiach. Má tri časti:

Tlmočník

Akonáhle načítavače triedy načítajú a overujú bytecode, tlmočník vykoná bytecode riadok po riadku. Táto realizácia je dosť pomalá. Nevýhodou tlmočníka je, že ak sa jedna metóda volá viackrát, vyžaduje sa vždy nová tlmočenie.

Avšak JVM používa na zmiernenie tejto nevýhody kompilátor JIT.

Kompilátor Just-In-Time (JIT)

Kompilátor JIT kompiluje bajtkód často volaných metód do natívneho kódu za behu. Preto je zodpovedný za optimalizáciu programov Java.

JVM automaticky sleduje, ktoré metódy sa vykonávajú. Keď sa metóda stane vhodnou na kompiláciu JIT, naplánuje sa kompilácia do strojového kódu. Táto metóda je potom známa ako horúca metóda. Táto kompilácia do strojového kódu sa deje na samostatnom vlákne JVM.

Vo výsledku to neruší vykonávanie aktuálneho programu. Po kompilácii do strojového kódu beží rýchlejšie.

Smetiar

Java sa stará o správu pamäte pomocou Garbage Collection. Je to proces pozerania na haldu pamäte, identifikácie, ktoré objekty sa používajú a ktoré nie, a nakoniec vymazania nepoužívaných objektov.

GC je vlákno démona. Dá sa to zavolať explicitne pomocou Systém.gc() Táto metóda sa však nevykoná okamžite a JVM rozhodne, kedy vyvolá GC.

2.4. Natívne rozhranie Java

Funguje ako rozhranie medzi kódom Java a natívnymi (C / C ++) knižnicami.

Existujú situácie, v ktorých samotná Java nezodpovedá potrebám vašej aplikácie, napríklad implementácia funkcie závislej od platformy.

V týchto prípadoch môžeme pomocou JNI povoliť volanie kódu spusteného v JVM. Naopak, umožňuje natívnym metódam volať kód bežiaci v JVM.

2.5. Natívne knižnice

Jedná sa o knižnice špecifické pre platformu a obsahuje implementáciu natívnych metód.

3. JRE

Java Runtime Environment (JRE) je balík softvérových komponentov používaných na spustenie aplikácií Java.

Medzi hlavné komponenty JRE patria:

  • Implementácia Java Virtual Machine (JVM)
  • Triedy potrebné na spustenie programov Java
  • Súbory nehnuteľností

O JVM sme hovorili vo vyššie uvedenej časti. Tu sa zameriame na základné triedy a podporné súbory.

3.1. Triedy bootstrapov

Triedy bootstrapu nájdeme pod jre / lib /. Táto cesta je tiež známa ako bootstrap classpath. Obsahuje:

  • Runtime triedy v rt.jar
  • Triedy internacionalizácie v i18n.jar
  • Triedy premeny znakov v jazyku charsets.jar
  • Ostatné

Bootstrap ClassLoader načíta tieto triedy pri spustení JVM.

3.2. Triedy rozšírenia

Triedy rozšírení nájdeme v jre / lib / extn / ktorý funguje ako adresár pre rozšírenia na platformu Java. Táto cesta je známa aj ako extension classpath.

Obsahuje runtime knižnice JavaFX v jfxrt.jar a miestne údaje pre java.text a java.util balíčky v localedata.jar. Používatelia môžu do tohto adresára tiež pridať vlastné nádoby.

3.3. Nastavenia vlastníctva

Platforma Java používa tieto nastavenia vlastností na udržanie svojej konfigurácie. V závislosti od ich použitia sú umiestnené v rôznych priečinkoch vo vnútri / jre / lib /. Tie obsahujú:

  • Konfigurácie kalendára v kalendár.vlastnosti
  • Konfigurácie prihlásenia do logovanie.vlastnosti
  • Sieťové konfigurácie v systéme Windows net.vlastnosti
  • Nasadenie nehnuteľností v / jre / lib / deploy /
  • Správa nehnuteľností v / jre / lib / management /

3.4. Ostatné súbory

Okrem vyššie uvedených súborov a tried obsahuje JRE aj súbory týkajúce sa iných záležitostí:

  • Správa bezpečnosti na jre / lib / bezpecnost
  • Adresár pre umiestnenie podporných tried pre applety na jre / lib / applet
  • Súbory týkajúce sa písma na jre / lib / fonty a ďalšie

4. JDK

Java Development Kit (JDK) poskytuje prostredie a nástroje na vývoj, kompiláciu, ladenie a vykonávanie programu Java.

Medzi základné komponenty JDK patria:

  • JRE
  • Vývojové nástroje

O JRE sme hovorili vo vyššie uvedenej časti.

Teraz sa zameriame na rôzne vývojové nástroje. Poďme kategorizovať tieto nástroje na základe ich použitia:

4.1. Základné nástroje

Tieto nástroje tvoria základ JDK a používajú sa na vytváranie a vytváranie aplikácií Java. Medzi týmito nástrojmi nájdeme pomocné programy na kompiláciu, ladenie, archiváciu, generovanie Javadocs atď.

Zahŕňajú:

  • javac - prečíta definície tried a rozhraní a skompiluje ich do súborov triedy
  • java - spúšťa aplikáciu Java
  • javadoc - generuje stránky HTML dokumentácie API zo zdrojových súborov Java
  • trefný - vyhľadá a vykoná anotačné procesory na základe anotácií prítomných v množine špecifikovaných zdrojových súborov
  • appletviewer - umožňuje nám spúšťať applety Java bez webového prehľadávača
  • jar - balíčky appletov alebo aplikácií Java do jedného archívu
  • jdb - nástroj na ladenie príkazového riadku, ktorý sa používa na vyhľadanie a opravu chýb v aplikáciách Java
  • javah - produkuje záhlavie C a zdrojové súbory z triedy Java
  • javap - rozoberie súbory triedy a zobrazí informácie o poliach, konštruktoroch a metódach prítomných v súbore triedy
  • extcheck - zisťuje konflikty verzií medzi cieľovým súborom Java Archive (JAR) a aktuálne nainštalovanými súbormi JAR s príponou

4.2. Bezpečnostné nástroje

Patria sem nástroje na správu kľúčov a certifikátov, ktoré sa používajú na manipuláciu s úložiskami kľúčov Java.

Java Keystore je kontajner pre autorizačné certifikáty alebo certifikáty verejných kľúčov. V dôsledku toho ho aplikácie založené na prostredí Java často používajú na šifrovanie, autentifikáciu a poskytovanie prostredníctvom protokolu HTTPS.

Pomáhajú tiež pri nastavovaní bezpečnostných politík v našom systéme a pri vytváraní aplikácií, ktoré môžu pracovať v rozsahu týchto zásad v produkčnom prostredí. Tie obsahujú:

  • keytool - pomáha pri správe položiek v úložisku kľúčov, konkrétne kryptografických kľúčov a certifikátov
  • jarsigner - generuje digitálne podpísané súbory JAR pomocou informácií o sklade kľúčov
  • politický nástroj - umožňuje nám spravovať konfiguračné súbory externej politiky, ktoré definujú bezpečnostnú politiku inštalácie

Niektoré bezpečnostné nástroje tiež pomáhajú pri správe lístkov Kerberos.

Kerberos je sieťový autentifikačný protokol.

Funguje na základe lístkov, ktoré umožňujú uzlom komunikujúcim cez nezabezpečenú sieť navzájom si bezpečným spôsobom preukázať svoju totožnosť:

  • kinit - slúži na získanie a uloženie do cache lístkov na udelenie lístkov Kerberos
  • ktab - spravuje základné názvy a páry kľúčov v tabuľke kľúčov
  • klist - zobrazí položky v lokálnej pamäti poverení a v tabuľke kľúčov

4.3. Nástroj internacionalizácie

Internacionalizácia je proces navrhovania aplikácie tak, aby ju bolo možné bez technických zmien prispôsobiť rôznym jazykom a regiónom.

Za týmto účelom prináša JDK native2ascii. Tento nástroj prevádza súbor so znakmi podporovanými JRE na súbory kódované v únikoch ASCII alebo Unicode.

4.4. Nástroje na vyvolanie vzdialenej metódy (RMI)

Nástroje RMI umožňujú vzdialenú komunikáciu medzi aplikáciami Java, čím poskytujú priestor pre vývoj distribuovaných aplikácií.

RMI umožňuje objektu bežiacemu v jednom JVM vyvolať metódy na objekte bežiacom v inom JVM. Medzi tieto nástroje patria:

  • rmic - generuje triedy stub, skeleton a tie pre vzdialené objekty pomocou Java Remote Method Protocol (JRMP) alebo Internet Inter-Orb Protocol (IIOP)
  • rmiregistry - vytvorí a spustí vzdialený register objektov
  • rmid - startuje démona aktivačného systému. Toto umožňuje registráciu a aktiváciu objektov vo virtuálnom stroji Java
  • serialver - vráti UID sériovej verzie pre zadané triedy

4.5. Nástroje Java IDL a RMI-IIOP

Java Interface Definition Language (IDL) pridáva platforme Java schopnosť Common Object-Based Request Broker Architecture (CORBA).

Tieto nástroje umožňujú distribuovaným webovým aplikáciám Java vyvolať operácie na vzdialených sieťových službách pomocou priemyselne štandardnej skupiny Object Management Group (OMG) - IDL.

Rovnako by sme mohli použiť internetový InterORB Protocol (IIOP).

RMI-IIOP, teda RMI over IIOP, umožňuje programovanie serverov a aplikácií CORBA prostredníctvom RMI API. Umožní sa tak spojenie medzi dvoma aplikáciami napísanými v ľubovoľnom jazyku kompatibilnom s CORBA prostredníctvom internetového protokolu InterORB (IIOP).

Medzi tieto nástroje patria:

  • tnameserv - prechodná služba pomenovania, ktorá poskytuje adresár v stromovej štruktúre pre odkazy na objekty
  • idlj - kompilátor IDL-to-Java na generovanie väzieb Java pre zadaný súbor IDL
  • orbd - umožniť klientom transparentne lokalizovať a vyvolať trvalé objekty na serveri v prostredí CORBA
  • servertool - poskytuje rozhranie príkazového riadku na registráciu alebo zrušenie registrácie trvalého servera pomocou programu ORB Daemon (orbd), spustite a vypnite trvalý server zaregistrovaný v ORB Daemon atď

4.6. Java Deployment Tools

Tieto nástroje pomáhajú pri rozmiestňovaní aplikácií a appletov Java na webe. Zahŕňajú:

  • balenie200 - transformuje súbor JAR na a pack200 súbor pomocou Java gzip kompresor
  • rozbaliť200 - transformuje pack200 súbor do súboru JAR

4.7. Java Plug-in Tool

JDK nám poskytuje htmlkonvertor. Ďalej sa používa v spojení s doplnkom Java.

Na jednej strane Java Plug-in vytvára spojenie medzi populárnymi prehliadačmi a platformou Java. Výsledkom tohto spojenia je, že applety na webovej stránke môžu bežať v prehliadači.

Na druhej strane, htmlconverter je nástroj na konverziu stránky HTML obsahujúcej applety do formátu pre doplnok Java.

4.8. Java Web Start Tool

JDK prináša javaws. Môžeme ho použiť v spojení s Java Web Start.

Tento nástroj nám umožňuje sťahovať a spúšťať Java aplikácie jediným kliknutím z prehľadávača. Preto nie je potrebné spúšťať žiadny inštalačný proces.

4.9. Nástroje na monitorovanie a správu

Jedná sa o skvelé nástroje, ktoré môžeme použiť na sledovanie výkonu JVM a spotreby zdrojov. Tu je niekoľko z nich:

  • jconsole - poskytuje grafickú konzolu, ktorá vám umožňuje monitorovať a spravovať aplikácie Java
  • jps - zoznam inštrumentovaných JVM v cieľovom systéme
  • jstat - sleduje štatistiku JVM
  • jstatd - monitoruje vytváranie a ukončenie inštrumentovaných JVM

4.10. Nástroje na riešenie problémov

Toto sú experimentálne nástroje, ktoré môžeme využiť na riešenie problémov s úlohami:

  • Info - generuje konfiguračné informácie pre zadaný proces Java
  • jmap - vypíše mapy pamäte zdieľaných objektov alebo haldy pamäte podrobnosti zadaného procesu
  • jsadebugd - sa pripája k procesu Java a slúži ako ladiaci server
  • jstack - vypíše stopy Java stackov vlákien Java pre daný proces Java

5. Záver

V tomto článku sme identifikovali, že základný rozdiel medzi JVM, JRE a JDK spočíva v ich použití.

Najprv sme opísali, ako je JVM abstraktný výpočtový stroj, ktorý v skutočnosti vykonáva bajtkód Java.

Potom sme vysvetlili, ako len spustiť Java aplikácie, používame JRE.

A nakoniec sme pochopili, ako vyvíjať Java aplikácie, používame JDK.

Trvalo nám tiež istý čas, kým sme načreli do nástrojov a základných konceptov týchto komponentov.