Co je JVM? Vysvětlete JVM Architecture

⚡ Chytré shrnutí

Java Virtuální stroj (JVM) je engine, který poskytuje běhové prostředí pro řízení Java kód, převádějící platformně nezávislý bajtkód do nativního strojového jazyka. Tvoří součást Java Runtime prostředí a umožňuje Javapřenositelnost s možností jednorázového zápisu a spuštění kdekoli.

  • 🧩 Bytecode Bridge: Jedno Java Kompilátor vytváří bajtkód místo strojového kódu a JVM interpretuje tento bajtkód na jakémkoli hostitelském systému.
  • 🏗️ Jádro Archistruktura: JVM kombinuje ClassLoader, oblast metod, haldu, zásobníky, registry PC a spouštěcí engine pro spouštění programů.
  • 🔄 Postup kompilace: Na rozdíl od C, Java nevyžaduje žádné linkování; soubory tříd se načtou do RAM, ověří a poté se spustí za běhu.
  • JIT kompilátor: Kompilátor Just-In-Time převádí bajtkód do nativního strojového kódu během provádění, aby se zlepšil výkon.
  • 🐢 Poznámka k výkonu: Dynamické linkování a interpretace za běhu historicky dělají Java pomalejší, ačkoli moderní verze tuto mezeru do značné míry uzavírají.

JVM Architecture

V čem je JVM Java?

Java Virtuální stroj (JVM) je motor, který poskytuje běhové prostředí pro řízení Java kód nebo aplikace. Převádí Java bytecode do strojového jazyka. JVM je součástí Java Runtime Environment (JRE). V jiných programovacích jazycích kompilátor vytváří strojový kód pro konkrétní systém. Nicméně Java kompilátor vytváří kód pro virtuální stroj známý jako Java Virtuální stroj.

Jak JVM funguje?

Za prvé, Java kód je zkompilován do bajtkódu. Tento bajtkód je interpretován na různých počítačích. Mezi hostitelským systémem a Java zdroj, bytecode je zprostředkující jazyk. JVM v Java je zodpovědný za alokaci paměťového prostoru.

Práce z Java Virtuální stroj JVM

Práce z Java Virtuální stroj (JVM)

Archistruktura JVM (Java virtuální stroj)

Nyní si pojďme vysvětlit architekturu JVM. Architektura JVM v Java obsahuje zavaděč tříd, paměťovou oblast, spouštěcí engine a další.

JVM Architecture

Java Virtuální stroj Architecture

1) ClassLoader
Zavaděč tříd je subsystém používaný pro načítání souborů tříd. Provádí tři hlavní funkce, a to načítání, linkování a inicializaci.

2) Oblast metody
Oblast metod JVM ukládá struktury tříd, jako jsou metadata, běhový fond konstant a kód pro metody.

3) Hromada
Všechny Objekty, jejich související proměnné instance a pole jsou uloženy v haldě. Tato paměť je společná a sdílená mezi více vlákny.

4) Zásobníky jazyka JVM
Java Jazykové zásobníky ukládají lokální proměnné a jejich částečné výsledky. Každé vlákno má svůj vlastní JVM zásobník, který se vytváří současně s jeho vytvářením. Nový rámec se vytvoří při každém volání metody a po dokončení procesu volání metody se odstraní.

5) Registry PC
Registr PC ukládá adresu Java instrukce virtuálního stroje, která se aktuálně provádí. V Java, každé vlákno má svůj vlastní samostatný registr PC.

6) Zásobníky nativních metod
Zásobníky nativních metod obsahují instrukce nativního kódu, které závisí na nativní knihovně. Jsou napsány v jiném jazyce místo Java.

7) Prováděcí stroj
Spouštěcí engine čte bajtkód a spouští jej po částech. Používá interpret a kompilátor Just-In-Time (JIT) k převodu bajtkódu do nativního strojového kódu a jeho spuštění.

8) Rozhraní nativních metod
Rozhraní Native Method Interface je programovací rámec. To umožňuje Java kód běžící v JVM pro volání a následné volání nativních aplikací a knihoven.

9) Knihovny nativních metod
Nativní knihovny jsou kolekcí nativních knihoven (C, C++), které potřebuje Execution Engine.

Software a licence Code Proces kompilace a spuštění

Abyste mohli napsat a spustit softwarový program, potřebujete následující:

  • 1) Redaktor – Pro zapsání programu; k tomu lze použít poznámkový blok.
  • 2) překladač – Převést váš program v programovacím jazyce vyšší úrovně do nativního strojového kódu.
  • 3) Linker – Sloučení různých odkazů na programové soubory v hlavním programu.
  • 4) Nakladač – Načtení souborů ze sekundárního paměťového zařízení, jako je pevný disk, flash disk nebo CD, do paměti RAM pro spuštění. Načítání se provede automaticky při spuštění kódu.
  • 5) Provedení – Skutečné spuštění kódu, které je zpracováváno vaším operačním systémem a procesorem.

S ohledem na tyto informace se podívejte na následující video a seznamte se s vnitřním fungováním a architekturou JVM (Java Virtuální stroj).

klikněte zde pokud video není přístupné

Proces kompilace a provádění kódu C

Porozumět Java proces kompilace, nejprve se krátce podívejme na proces kompilace a linkování v jazyce C.

Předpokládejme, že ve funkci main jste zavolali dvě funkce, f1 a f2. Funkce main je uložena v souboru a1.c.

Hlavní funkce a1.c v kódu C

Funkce f1 je uložena v souboru a2.c.

Funkce f1 a2.c v kódu C

Funkce f2 je uložena v souboru a3.c.

Funkce f2 a3.c v kódu C

Všechny tyto soubory, tj. a1.c, a2.c a a3.c, jsou odeslány kompilátoru, jehož výstupem jsou odpovídající objektové soubory, což je strojový kód.

Kompilátor kódu C vytváří objektové soubory

Dalším krokem je integrace všech těchto objektových souborů do jednoho souboru .exe pomocí linkeru. Linker všechny tyto soubory sloučí dohromady a vytvoří soubor .exe.

Linker kódu C vytváří soubor exe

Během běhu programu zaváděcí program načte soubor .exe do RAM k provedení.

Zavaděč kódu C načte exe soubor do RAM

Java kompilace a spuštění kódu v Java VM

Nyní se podívejme na proces JavaVe vašem hlavním prostředí máte dvě metody, f1 a f2.

  • Hlavní metoda je uložena v souboru a1.java.
  • f1 je uložen v souboru jako a2.java
  • f2 je uložen v souboru jako a3.java

Java kód zkompiluje tři soubory do souborů tříd

Kompilátor zkompiluje tyto tři soubory a vytvoří tři odpovídající soubory .class, které se skládají z kódu typu BYTE. Na rozdíl od jazyka C se zde neprovádí žádné linkování.

Jedno Java VM, zlato Java Virtuální stroj se nachází v paměti RAM. Během provádění se pomocí zavaděče tříd soubory tříd přenesou do paměti RAM. Kód BYTE je ověřován na případné bezpečnostní narušení.

Java zavaděč tříd přenese soubory tříd do RAM

Dále prováděcí engine převede bajtkód do nativního strojového kódu. Jedná se o kompilaci just-in-time. Je to jeden z hlavních důvodů, proč Java je poměrně pomalý.

Java spouštěcí engine převádí bajtkód do nativního kódu

POZNÁMKA: JIT neboli kompilátor Just-in-time je součástí Java Virtuální stroj (JVM). Interpretuje části bajtového kódu, které mají současně podobnou funkcionalitu.

Proč je Java jak interpretovaný, tak kompilovaný jazyk?

Programovací jazyky jsou klasifikovány jako:

  • Jazyk vyšší úrovně, např. C++, Java
  • Jazyky střední úrovně, např. C
  • Nízkoúrovňový jazyk, např. Assembly
  • Nakonec nejnižší úroveň jako strojový jazyk

A kompilátor je program, který převádí program z jedné jazykové úrovně na jinou. Například převod C++ program do strojového kódu. Java kompilátor převádí kódy na vysoké úrovni Java kód do bajtkódu (což je také typ strojového kódu).

An tlumočník je program, který převádí program na jedné úrovni do jiného programovacího jazyka na dané úrovni. stejná úroveňNapříklad konverze Java naprogramovat do C++.

In Java, generátor kódu Just-In-Time převádí bajtkód do nativního strojového kódu, které jsou na stejných programovacích úrovních. Proto, Java je jak kompilovaný, tak interpretovaný jazyk.

Proč je Java pomalý?

Dva hlavní důvody pomalosti Java jsou:

  1. Dynamické propojení: Na rozdíl od C se propojení provádí za běhu, pokaždé, když je program spuštěn Java.
  2. Interpret za běhu: Převod bajtového kódu na nativní strojový kód se provádí za běhu Java, což dále zpomaluje rychlost.

Nejnovější verze však Java do značné míry vyřešily tyto výkonnostní úzké místo.

Nejčastější dotazy

JVM provozuje frameworky pro umělou inteligenci a big data, jako jsou Deeplearning4j, Weka a Apache. SparkJeho kompilátor Just-In-Time a správa paměti umožňují těmto knihovnám efektivně zpracovávat velké datové sady napříč platformami bez nutnosti přepisování nativního kódu.

Ano. Profilery s podporou umělé inteligence dokáží analyzovat protokoly garbage collection, navrhovat velikosti hald a označovat pomalé metody. Pomáhají ladit příznaky JVM a rychleji odhalovat úzká hrdla, i když by vývojář měl i tak ověřit každou doporučenou změnu.

JVM spouští bajtkód. JRE dodává JVM k dispozici základní knihovny potřebné ke spuštění. Java programy. JDK přidává vývojářské nástroje, jako je kompilátor a debugger, takže se používá k vytváření aplikací.

Bajtkód je nezávislý na platformě, ale samotné JVM je závislé na platformě. Každý operační systém potřebuje vlastní implementaci JVM. Tento design umožňuje spuštění stejného zkompilovaného bajtkódu kdekoli, kde je nainstalováno kompatibilní JVM.

Shrňte tento příspěvek takto: