Hvad er JVM? Forklar JVM Architecture

⚡ Smart opsummering

Java Virtuel maskine (JVM) er den motor, der leverer et runtime-miljø til at drive Java kode, der konverterer platformuafhængig bytekode til oprindeligt maskinsprog. Det er en del af Java Runtime Environment og muliggør Java's bærbarhed, der kan skrives én gang og køres overalt.

  • 🧩 Bytecode-bro: Java Compileren producerer bytekode i stedet for maskinkode, og JVM'en fortolker denne bytekode på ethvert værtssystem.
  • 🏗️ Core Archilære: JVM kombinerer en ClassLoader, et metodeområde, en heap, stacks, PC-registre og en udførelsesmotor til at køre programmer.
  • 🔄 Kompileringsflow: I modsætning til C, Java kræver ingen linkning; klassefiler indlæses i RAM, verificeres og udføres derefter under kørsel.
  • JIT-compiler: Just-In-Time-compileren konverterer bytekode til native maskinkode under udførelsen for at forbedre ydeevnen.
  • ???? Ydelsesbemærkning: Dynamisk linkning og runtime-fortolkning gør historisk set Java langsommere, selvom moderne versioner stort set lukker dette hul.

FMV Architecture

Hvad er JVM i Java?

Java Virtuel maskine (JVM) er en motor, der giver et driftsmiljø til at køre Java kode eller applikationer. Den konverterer Java bytekode til maskinsprog. JVM er en del af Java Runtime Environment (JRE). I andre programmeringssprog producerer compileren maskinkode til et bestemt system. Imidlertid Java compileren producerer kode til en virtuel maskine kendt som Java Virtuel maskine.

Hvordan fungerer JVM?

First, Java Koden kompileres til bytekode. Denne bytekode fortolkes på forskellige maskiner. Mellem værtssystemet og Java kildekode, bytecode er et mellemliggende sprog. JVM i Java er ansvarlig for at tildele hukommelsesplads.

Arbejde af Java Virtuel maskine JVM

Arbejde af Java Virtuel maskine (JVM)

Architecture af JVM (Java virtuel maskine)

Lad os nu forstå arkitekturen i JVM. JVM-arkitektur i Java indeholder en klasseindlæser, et hukommelsesområde, en udførelsesmotor og mere.

FMV Architecture

Java Virtual Machine Architecture

1) ClassLoader
Klasseindlæseren er et undersystem, der bruges til at indlæse klassefiler. Den udfører tre hovedfunktioner, nemlig indlæsning, sammenkædning og initialisering.

2) Metodeområde
JVM-metodeområdet gemmer klassestrukturer som metadata, den konstante runtime-pulje og koden til metoder.

3) Hobe
Alle Objekter, deres relaterede instansvariabler og arrays gemmes i heapen. Denne hukommelse er fælles og deles på tværs af flere tråde.

4) JVM-sprogstakke
Java Sprogstakke gemmer lokale variabler og deres delvise resultater. Hver tråd har sin egen JVM-stak, der oprettes samtidig med at tråden oprettes. En ny frame oprettes, hver gang en metode kaldes, og den slettes, når metodekaldsprocessen er fuldført.

5) PC-registre
PC-registeret gemmer adressen på Java virtuel maskininstruktion, der i øjeblikket udføres. I Java, hver tråd har sit eget separate PC-register.

6) Native Method Stacks
Native metodestakke indeholder instruktioner fra native kode, der afhænger af det native bibliotek. De er skrevet på et andet sprog i stedet for Java.

7) Udførelsesmotor
Udførelsesmotoren læser bytekoden og udfører den stykke for stykke. Den bruger en fortolker og en Just-In-Time (JIT) compiler til at konvertere bytekoden til native maskinkode og køre den.

8) Native metodegrænseflade
Native Method Interface er en programmeringsramme. Det tillader Java kode, der kører i en JVM, for at kalde, og blive kaldt af, native applikationer og biblioteker.

9) Native metodebiblioteker
Native Libraries er en samling af de native biblioteker (C, C++), som er nødvendige for udførelsesmotoren.

Software Code Kompilerings- og udførelsesproces

For at skrive og udføre et softwareprogram skal du bruge følgende:

  • 1) Redaktør – Til at skrive dit program ind i; en notesblok kan bruges til dette.
  • 2) compiler – At konvertere dit avancerede sprogprogram til native maskinkode.
  • 3) Linker – At kombinere de forskellige programfilreferencer i dit hovedprogram.
  • 4) Læssemaskine – At indlæse filer fra din sekundære lagerenhed, såsom en harddisk, et flashdrev eller en cd, til RAM til udførelse. Indlæsningen sker automatisk, når du udfører din kode.
  • 5) Udførelse – Faktisk udførelse af koden, som håndteres af dit operativsystem og din processor.

Med denne baggrund kan du se følgende video og lære JVM's interne funktion og arkitektur at kende (Java virtuel maskine).

Klik link. hvis videoen ikke er tilgængelig

C-kode kompilerings- og eksekveringsproces

For at forstå Java kompileringsprocessen, lad os først tage et hurtigt kig på kompilerings- og linkningsprocessen i C.

Antag, at du i hovedfunktionen har kaldt to funktioner, f1 og f2. Hovedfunktionen er gemt i filen a1.c.

C-kode hovedfunktion a1.c

Funktion f1 er gemt i en fil a2.c.

C-kodefunktion f1 a2.c

Funktion f2 er gemt i en fil a3.c.

C-kodefunktion f2 a3.c

Alle disse filer, dvs. a1.c, a2.c og a3.c, føres til compileren, hvis output er de tilsvarende objektfiler, som er maskinkoden.

C-kode compiler producerer objektfiler

Det næste trin er at integrere alle disse objektfiler i en enkelt .exe-fil ved hjælp af en linker. Linkeren vil samle alle disse filer og producere .exe-filen.

C-kodelinker producerer exe-fil

Under programkørslen vil et indlæsningsprogram indlæse en .exe i RAM til udførelse.

C-kodeindlæser indlæser exe i RAM

Java kode kompilering og eksekvering i Java VM

Lad os nu se på processen for JavaI din hovedmetode har du to metoder, f1 og f2.

  • Hovedmetoden er gemt i filen a1.java
  • f1 er gemt i en fil som a2.java
  • f2 er gemt i en fil som a3.java

Java Kode kompilerer tre filer til klassefiler

Compileren vil kompilere de tre filer og producere tre tilsvarende .class-filer, som består af BYTE-kode. I modsætning til C foretages der ingen linkning.

Java VM, guld Java Virtuel maskine, der findes på RAM'en. Under udførelsen, ved hjælp af klasseindlæseren, overføres klassefilerne til RAM'en. BYTE-koden verificeres for eventuelle sikkerhedsbrud.

Java klasseindlæser henter klassefiler ind i RAM

Dernæst konverterer eksekveringsmotoren bytekoden til native maskinkode. Dette er just-in-time-kompilering. Det er en af ​​hovedårsagerne til, at Java er forholdsvis langsom.

Java Udførelsesmotoren konverterer bytekode til native kode

BEMÆRK VENLIGST: JIT, eller Just-in-time-compileren, er den del af Java Virtuel maskine (JVM). Den fortolker dele af bytekoden, der har lignende funktionalitet på samme tid.

Hvorfor er Java både fortolket og kompileret sprog?

Programmeringssprog er klassificeret som:

  • Højere niveau sprog, f.eks. C++, Java
  • Mellemniveausprog, f.eks. C
  • Lavniveausprog, f.eks. Assembly
  • Endelig, det laveste niveau som maskinsproget

A compiler er et program, der konverterer et program fra ét sprogniveau til et andet. For eksempel konverteringen af ​​et C++ program ind i maskinkode. Det Java compiler konverterer på højt niveau Java kode til bytekode (som også er en type maskinkode).

An tolk er et program, der konverterer et program på ét niveau til et andet programmeringssprog på samme niveauFor eksempel konverteringen af ​​en Java program ind C++.

In Java, konverterer Just-In-Time-kodegeneratoren bytekoden til den native maskinkode, som er på de samme programmeringsniveauer. Derfor, Java er både et kompileret og et fortolket sprog.

Hvorfor er Java langsom?

De to hovedårsager bag langsomheden af Java er:

  1. Dynamisk linking: I modsætning til C, sker linkning ved kørsel, hver gang programmet køres ind Java.
  2. Run-time Tolk: Konverteringen af ​​bytekode til indbygget maskinkode udføres ved run-time in Java, hvilket yderligere sænker hastigheden.

Imidlertid er de nyeste versioner af Java har i vid udstrækning adresseret disse flaskehalse i ydeevnen.

Ofte Stillede Spørgsmål

JVM'en kører AI- og big-data-frameworks som Deeplearning4j, Weka og Apache SparkDens Just-In-Time-compiler og hukommelsesstyring gør det muligt for disse biblioteker at behandle store datasæt effektivt på tværs af platforme uden at omskrive native kode.

Ja. AI-assisterede profileringsværktøjer kan analysere garbage collection-logfiler, foreslå heap-størrelser og markere langsomme metoder. De hjælper med at finjustere JVM-flag og finde flaskehalse hurtigere, selvom en udvikler stadig bør validere alle anbefalede ændringer.

JVM'en kører bytecode. JRE'en samler JVM'en med de kernebiblioteker, der er nødvendige for at køre Java programmer. JDK tilføjer udviklingsværktøjer såsom compileren og debuggeren, så den bruges til at bygge applikationer.

Bytecode er platformuafhængig, men selve JVM'en er platformafhængig. Hvert operativsystem kræver sin egen JVM-implementering. Dette design tillader den samme kompilerede bytecode at køre overalt, hvor en kompatibel JVM er installeret.

Opsummer dette indlæg med: