Java virtuális gép - Útmutató a JVM építészetéhez és annak alkatrészéhez

Tartalomjegyzék:

Anonim

Bevezetés a Java virtuális gépbe

Ebben a cikkben megismerjük a Java virtuális gépet, más néven: „JVM”. A Java virtuális gép egy virtuális gép, amely lehetővé teszi egy számítógépes rendszer számára a Java programok futtatását / végrehajtását. Alapvetően a JVM egy olyan motor, amely futási környezetként működik a Java kód számára. A JVM a Java kódot gépi nyelvre konvertálja. Egy lefordított .class fájl futtatásakor a JVM-hez kerül, majd a JVM visszaadja a kimenetet. A Java virtuális gép a JRE része, amely a „Java Runtime Environment” kifejezést jelenti. A Java virtuális gép alapvető feladatai a kód betöltése, majd a kód ellenőrzése és végrehajtása. Ezenkívül biztosítsa a futtatási környezetet a kód végrehajtásához. A JVM különféle összetevőkből áll, mint például a Classloader, a JVM által kiosztott területlista, például a Stack, az Execution Engine és néhány natív könyvtár.

A Java virtuális gép architektúrája

A fenti képen látható módon a Java virtuális gép architektúrája különféle összetevőket tartalmaz. Tanuljuk meg minden egyes komponenst külön-külön.

loader

Ahogy a neve is sugallja, ez egy összetevő, amely felelős az osztályfájlok betöltése. Az osztályfájl betöltése, összekapcsolása és inicializálása a betöltő fő funkciói. A betöltő futási időben működik.

  • Betöltés: Alapvetõen a betöltõ elolvassa a .class fájlt, majd generálja a bináris kódot, és elmenti azt egy metódus területre. A Bootstrap Classloader, Extension Classloader és Application Classloader a különféle ClassLoaders, amelyek felelősek a különböző osztályok betöltéséért.
  • Összekapcsolás: három fő funkció, például az ellenőrzés, az előkészítés és a feloldás. A .class fájl ellenőrzésével kezdődik. Ha az ellenőrzés sikertelen, kivételt tesz a futási idő ellenőrzésére. Később a memóriát az alapértelmezett értékekkel rendelkező változókhoz osztják el. Ezután végül a szimbolikus memória hivatkozásokat felváltják a memória területéből származó közvetlen hivatkozások.
  • Inicializálás: Ez a ClassLoader utolsó része. Az eredeti értékeket az összes statikus változóhoz hozzárendeljük, majd a statikus blokk végrehajtását követi. Ez a rész az osztály tetejétől lefelé hajt végre.

Halom

Az objektum és a példányváltozók részletei itt mind tárolódnak. Ez egy megosztott memória terület, ami azt jelenti, hogy az itt tárolt adatok nem biztonságosak a szál számára.

Kivétel a „fő” szálban java.lang.OutOfMemoryError: Java halom hely

Az egyik legmegfelelőbb hiba az „OutOfMemoryError kivétel, amely azt jelenti, hogy a JVM nem oszthat ki egy objektumot a Heap területén, vagy a memóriaelosztást nem lehet ugyanazon objektumra elvégezni.

Kazal

Itt hoz létre külön futási idő verem minden új szálhoz. Futásidejű verem néven is ismert, minden módszer meghívásakor az összes részletet a megfelelő futásidejű állományban tárolják, és a módszer befejezése után ezeket a részleteket eltávolítják a veremből.

PC regiszterek

Minden egyes szálhoz külön PC (Program Counter) regisztert hozunk létre, amely tárolja az aktuális végrehajtási utasítás címét, amelyet később a következő utasítás frissít. Ez a memóriaterület meglehetősen kicsi és rögzített méretű.

Natív módszer verem

Ez a saját memóriaterületének egyike, amelyet egy szál hív meg, majd a szál egy teljesen új szintre kerül, ahol a Java virtuális gép által felvetett szerkezeti és biztonsági korlátozások már nem működnek. A többi futásiidejű memóriaterülethez képest a natív módszer-kötegek által elfoglalt memória nincs rögzített méretű, korlátozás nélkül növekszik vagy csökken.

Java natív interfész

A JNI egyszerűen csak kölcsönhatásba lép az alább említett natív módszer könyvtárakkal, amelyek C, C ++ megvalósításúak, és ugyanazt biztosítják a végrehajtó motor számára. A JNI engedélyezi az összeszerelési kódhoz való közvetlen hozzáférést. JVM esetén a Java és a natív a kétféle kód. A JNI zökkenőmentesen létrehoz egy jól meghatározott kapcsolatot a kettő között.

Natív módszer könyvtárak

Natív könyvtárak gyűjteménye, ahogyan azt a Execution Engine előírja.

Végrehajtó motor

Nos, most van a java program a bytecode-ba, amelyet egy osztálybetöltővel rendelünk a fent kifejtett adatterületekhez, és most a byte-kódot a végrehajtó motor fogja végrehajtani. Az Execution Engine egyszerűen olvassa el a bájtkódot egységekben, mint például a kódsorokat egyenként olvasó gép. A bájtkód ember által olvasható formátum, ezért a gép nem tudja olvasni, mert van, és gépi olvasható formátumra kell átalakítani, ahol az alábbi összetevőket értelmezés céljából használják.

A végrehajtó motor három fő összetevőből áll: Interpreter, JIT Compiler és Garbage Collector.

1. Tolmács

Egyszerűen, végrehajtja a bytekódot egy szekvenciális módszerrel. A hívást parancssori lekérdezéssel hajtjuk végre, egy argumentumként összeállított fájlt használva. A tolmács elég gyorsan értelmezi és végrehajtja a parancsokat egyenként, ami gyorsabban történik, mint a JIT fordító a kód lefordításához.

java osztály neve

A main () osztály kötelező a fordított .class fájlban.

2. JIT fordító

A Java Runtime Environment egyik legfontosabb összetevője, amely javítja a Java alkalmazás teljesítményét futási időben. Egyetlen más elem sem befolyásolja jobban a teljesítményt, mint a JIT Compiler. Ez egy alapértelmezett fordító, és bármilyen Java módszer meghívásakor aktiválódik.

3. Szemétgyűjtő

Ahogy a neve is sugallja, ennek valamilyen köze van a szemetekhez, a Garbage Collector egyszerűen megkeresi a JVM halomterületén elérhető összes lehetséges objektumot, ellenőrzi, hogy van-e használatban, majd törli a fel nem használt elemeket. Tehát egyszerűen megjelöli azokat a memóriadarabokat, amelyek már használatban vannak vagy sem. Ezután elsöprődik, ahol egyszerűen eltávolítja a megjelölt tárgyat. A legjobb esetben a kézi memóriaelosztó rendszerre nincs szükség, mivel a Garbage Collector automatikusan eltávolítja a fel nem használt memóriaterületet. Mivel azonban ez egy automatikus feladat, egyetlen programozó sem tudja ellenőrizni az egyes időrések ütemezését a konkrét tisztítási feladatok elvégzéséhez, és nagyobb CPU-energiát igényel, amikor tárgyi referenciákat keres.

Következtetés

Bár a JVM működésének egyértelmű megértése nem kötelező, a Java kód írása szempontjából rendkívül hasznos. Egy fejlesztő számára, aki megérti a JVM működését, jobb és optimalizált kódot fog írni, bármennyire is hosszú vagy összetett. Az itt ismertetett leírás mellett a JVM számos funkciót és technológiát kínál. Ezek a funkciók felhasználhatók a teljesítmény javítására egy adott gyártó igényei szerint

Ajánlott cikkek

Ez egy útmutató a Java virtuális géphez. Itt a java virtuális gép architektúráját és annak különféle alkotóelemeit tárgyaljuk. A következő cikkeket is megnézheti további információkért -

  1. Bubble Rendezés a JavaScript-ben
  2. Szál életciklusa Java-ban
  3. Mi a Java SE?
  4. A legjobb Java fordítók
  5. JRE vs JVM | A 8 legfontosabb különbség az (infographics) között