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 -
- Bubble Rendezés a JavaScript-ben
- Szál életciklusa Java-ban
- Mi a Java SE?
- A legjobb Java fordítók
- JRE vs JVM | A 8 legfontosabb különbség az (infographics) között