logo

Jak JVM funguje - JVM architektura

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.

Jvm' title=

Komponenty architektury JVM

Nyní podrobně probereme každou komponentu JVM.



1. Subsystém Class Loader

Zodpovídá především za tři činnosti. 

class_loader_subsystem' loading='lazy' title=

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.
Java
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
// 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++.