Úvod do Java Virtual Machine
V tomto článku se dozvíme o Java Virtual Machine, alias „JVM“. Java Virtual Machine je virtuální počítač, který umožňuje počítačovému systému spouštět / spouštět programy Java. JVM je v podstatě motor, který funguje jako běhové prostředí pro kód Java. JVM převádí java kód do strojového jazyka. Když spustíte kompilovaný soubor .class, přejde na JVM a poté JVM vrátí výstup. Java Virtual Machine je součástí JRE, což znamená „Java Runtime Environment“. Základní úkoly Java Virtual Machine spočívají v Načtení kódu, ověření kódu a provedení kódu. Poskytněte také běhové prostředí pro provádění kódu. JVM se skládá z různých součástí, jako je Classloader, seznamu prostoru přiřazeného JVM, jako je Stack, Execution Engine a několika nativních knihoven.
Architektura Java Virtual Machine
Jak je vidět na obrázku výše, architektura Java Virtual Machine Architecture se skládá z různých komponent. Pojďme se dozvědět o každé konkrétní součásti samostatně.
Nakladač
Jak název napovídá, jedná se o součást zodpovědnou za načítání souborů třídy. Načítání, propojení a inicializace souboru třídy jsou hlavní funkce zavaděče. Zavaděč pracuje za běhu.
- Načítání: Zavaděč v zásadě přečte soubor .class, poté vygeneruje binární kód a uloží jej do oblasti metod. Bootstrap Classloader, Extension Classloader a Application Classloader jsou různé ClassLoaders odpovědné za načítání různých tříd.
- Propojení: Tři hlavní funkce, jako je Ověření, Příprava a Řešení. Začíná to ověřením souboru .class. Pokud se ověření nezdaří, poskytuje výjimku ověření doby běhu. Později je paměť přiřazena k proměnným s výchozími hodnotami. Nakonec jsou symbolické paměťové odkazy nahrazeny přímým odkazem z paměťové oblasti.
- Inicializace: Toto je poslední část ClassLoader. Původní hodnoty jsou přiřazeny ke všem statickým proměnným a následuje provedení statického bloku. Tato část se spouští shora dolů.
Halda
Zde jsou uloženy podrobnosti o proměnných objektu a instance. Jedná se o oblast sdílené paměti, což znamená, že zde uložená data nejsou bezpečná pro podprocesy.
Výjimka v podprocesu „main“ java.lang.OutOfMemoryError: Prostor haldy Java
Jednou z nejvíce relativních chyb je výjimka „OutOfMemoryError “, což znamená, že JVM nemůže přidělit objekt v oblasti haldy nebo pro stejný objekt nelze provést přidělení paměti.
Zásobník
Zde je pro každý nový podproces vytvořen samostatný běhový zásobník. Také známý jako run-time stack, pokaždé, když je metoda vyvolána, jsou všechny detaily uloženy v odpovídajícím runtime stojanu a po dokončení metody jsou tyto detaily odstraněny ze zásobníku.
Registry PC
Pro každé jedno vlákno se vytvoří samostatný registr PC (Program Counter), který ukládá adresu aktuální prováděcí instrukce, která bude později aktualizována další instrukcí. Tato paměťová oblast je poměrně malá a má pevnou velikost.
Zásobník nativní metody
Je to jedna ze svých vlastních oblastí paměti, která je vyvolána vláknem a vlákno je pak na zcela nové úrovni, kde se již nevykonává struktura a bezpečnostní omezení vyplývající z Java Virtual Machine. Ve srovnání s jinými oblastmi runtime paměti nemá paměť zabíraná zásobníky nativní metody pevnou velikost bez omezení přírůstku nebo snížení.
Java Native Interface
JNI jednoduše interaguje s níže uvedenými knihovnami nativních metod, které jsou implementovány v C, C ++, a poskytují totéž prováděcímu motoru. Přímý přístup k kódu sestavy je povolen JNI. Pro JVM jsou Java a Native dva typy kódů. JNI plynule vytváří dobře definované spojení mezi těmito dvěma.
Knihovny nativních metod
Sbírka domorodých knihoven, jak vyžaduje Execution Engine.
Prováděcí motor
Nyní máme program java do bajtkódu, který je přiřazen k výše vysvětleným datovým oblastem pomocí zavaděče třídy a nyní bytecode bude prováděn prováděcím motorem. Execution Engine jednoduše přečte bytecode v jednotkách, jako stroj čte řádky kódu jeden po druhém. Bajtkód je formát čitelný člověkem, a proto jej stroj nemůže číst, je a musí být převeden do strojově čitelného formátu, kde jsou pro interpretační účely použity níže uvedené komponenty.
Execution Engine má tři hlavní komponenty, kterými jsou Interpreter, JIT Compiler a Garbage Collector.
1. Tlumočník
Jednoduše provede bytecode sekvenční metodou. Volání se provádí dotazem na příkazovém řádku s kompilovaným souborem jako argumentem. Tlumočník je docela rychlý při interpretaci a provádění příkazů jeden po druhém, což se děje rychleji než kompilátor JIT pro kompilaci kódu.
název třídy java
Hlavní třída () je v kompilovaném souboru .class.
2. Kompilátor JIT
Jedna z nejdůležitějších součástí Java Runtime Environment, která zvyšuje výkon Java Application za běhu. Žádná jiná komponenta nemá větší dopad na výkon než kompilátor JIT. Toto je výchozí kompilátor a aktivuje se při volání metody Java.
3. Sběratel odpadu
Jak už název napovídá, má to něco společného s odpadky, Garbage Collector jednoduše hledá každý možný objekt dostupný v haldy JVM, zkontroluje, zda je používán, a poté odstraní nepoužité. Jednoduše to označuje části paměti, které jsou nebo nejsou používány. Poté pokračuje v zametání, kde jednoduše odstraní označený objekt. Nejlepším případem použití je, že není nutný žádný systém manuální alokace paměti, protože sběratel odpadu provádí automatické odstraňování nevyužitého paměťového prostoru. Jelikož se však jedná o automatický úkol, žádný programátor nemá kontrolu nad plánováním jakéhokoli časového slotu pro specificky úkol čištění a při hledání odkazů na objekty nevyžaduje více energie procesoru.
Závěr
Ačkoli není povinné mít jasnou představu o tom, jak JVM pracuje, pro účely psaní kódu Java je nesmírně užitečné. Pro vývojáře, který chápe fungování JVM, bude psát lepší a optimalizovaný kód, ať už je tento požadavek dlouhý nebo složitý. Kromě zde uvedeného popisu poskytuje JVM širokou škálu funkcí a technologií. Tyto funkce lze použít ke zlepšení výkonu podle potřeby konkrétního dodavatele
Doporučené články
Toto je průvodce po Java Virtual Machine. Zde diskutujeme architekturu java virtuálního stroje spolu s jeho různými komponenty. Další informace naleznete také v následujících článcích -
- Řazení bublin v JavaScriptu
- Životní cyklus vlákna v Javě
- Co je Java SE?
- Nejlepší Java překladače
- JRE vs JVM | 8 hlavních rozdílů s (infografika)