Java Virtual Machine (JVM) je základní komponenta Java Runtime Environment (JRE), která umožňuje programům Java běžet na jakékoli platformě bez úprav. JVM funguje jako tlumočník mezi bytekódem Java a základním hardwarem a poskytuje slavnou schopnost Java Write Once Run Anywhere (WORA).
- Zdroj Java (.java) -> zkompilovaný javacem -> bytecode (.class)
- JVM načte bajtkód, ověří, že jej propojí, a poté jej spustí
- Spuštění může zahrnovat interpretaci bajtkódu nebo použití kompilace JIT (Just-In-Time) k převodu horkého kódu na nativní strojový kód pro zvýšení výkonu
- Garbage collection běží na pozadí, aby znovu získal paměť z nepoužívaných objektů
Architektura JVM
Obrázek níže ukazuje architekturu a klíčové komponenty JVM.
Komponenty architektury JVM
Nyní podrobně probereme každou komponentu JVM.
1. Subsystém Class Loader
Zodpovídá především za tři činnosti.
1. Načítání
- Čte soubory .class a ukládá metadata třídy v oblasti metod.
- Vytvoří objekt Class v haldě představující načtenou třídu.
class GFG{ static{ System.out.println('GFG class is loaded by the JVM!'); } public void display(){ System.out.println('Method of GFG class is executed.'); } } public class Test{ public static void main(String[] args) throws Exception{ System.out.println('Main method started.'); // Loading the class explicitly using Class.forName() Class.forName('GFG'); System.out.println('Class loaded successfully.'); // Creating object to execute method GFG obj = new GFG(); obj.display(); } }
Výstup
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.
Poznámka: Za každé nabité .třída pouze soubor jeden je vytvořen objekt třídy.
2. Propojení: Zodpovědný za přípravu načtené třídy k provedení. Zahrnuje tři kroky:
- Ověření: Zajišťuje, že bytecode dodržuje pravidla JVM a je bezpečný pro spuštění.
- Příprava: Přiděluje paměť pro statické proměnné a přiřazuje výchozí hodnoty.
- Rezoluce: Převádí symbolické odkazy na přímé odkazy v paměti.
3. Inicializace
- Přiřazuje skutečné hodnoty statickým proměnným.
- Spouští statické bloky definované ve třídě.
Typy zavaděče třídy
- Zavaděč třídy Bootstrap: Načte základní třídy Java (JAVA_HOME/lib).
- Zavaděč třídy rozšíření: Načte třídy z adresáře rozšíření (JAVA_HOME/jre/lib/ext).
- Zavaděč třídy systému/aplikace: Načte třídy z cesty třídy aplikace.
// Java code to demonstrate Class Loader subsystem public class Geeks { public static void main(String[] args) { // String class is loaded by bootstrap loader and // bootstrap loader is not Java object hence null System.out.println(String.class.getClassLoader()); // Test class is loaded by Application loader System.out.println(Geeks.class.getClassLoader()); } }
Výstup
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
2. Oblasti paměti JVM
- Oblast metody: Ukládá informace na úrovni třídy, jako jsou proměnné metody rodičovské třídy názvu třídy a statická data. Sdíleno napříč JVM.
- Oblast haldy: Ukládá všechny předměty. Sdíleno napříč JVM.
- Oblast zásobníku: Každé vlákno má svůj vlastní runtime zásobník; ukládá volání metod lokálních proměnných do zásobníkových snímků. Zničeno, když vlákno skončí.
- PC registry: Podržte adresu aktuálně prováděné instrukce pro každé vlákno.
- Zásobníky nativních metod: Každé vlákno má samostatný zásobník pro provádění nativní metody.
3. Prováděcí stroj
Prováděcí stroj spustí .class (bytecode). Čte bajtový kód řádek po řádku, využívá data a informace přítomné v různých paměťových oblastech a provádí instrukce. Dá se rozdělit do tří částí:
- Tlumočník: Interpretuje bajtkód řádek po řádku a poté se provede. Nevýhodou je, že když je jedna metoda volána vícekrát pokaždé, když je vyžadována interpretace.
- Just-In-Time Compiler (JIT): Používá se ke zvýšení efektivity tlumočníka. Zkompiluje celý bajtkód a změní jej na nativní kód, takže kdykoli interpret vidí opakovaná volání metod, JIT poskytuje přímý nativní kód pro tuto část, takže není vyžadována opakovaná interpretace, čímž se zvyšuje efektivita.
- Sběratel odpadu: Ničí nereferencované objekty. Více o Garbage Collector viz Sběratel odpadků .
4. Java Native Interface (JNI)
Je to rozhraní, které spolupracuje s knihovnami nativních metod a poskytuje nativní knihovny (C C++) potřebné pro spuštění. Umožňuje JVM volat knihovny C/C++ a být volán knihovnami C/C++, které mohou být specifické pro hardware.
5. Knihovny nativních metod
Jedná se o kolekce nativních knihoven potřebných pro provádění nativních metod. Zahrnují knihovny napsané v jazycích jako C a C++.