Forskellen mellem JVM, JRE og JDK

1. Oversigt

I denne artikel vil vi diskutere forskelle mellem JVM, JRE og JDK ved at overveje deres komponenter og anvendelser.

2. JVM

Java Virtual Machine (JVM) er en implementering af en virtuel maskine, der udfører et Java-program.

JVM fortolker først bytekoden. Derefter gemmer klasseoplysningerne i hukommelsesområdet. Endelig udfører den bytecode genereret af java compileren.

Det er en abstrakt computermaskine med sit eget instruktions sæt og manipulerer forskellige hukommelsesområder ved kørsel.

Komponenterne til JVM er:

  • Klasselæssere
  • Run-Time Data Areas
  • Køremotor

2.1. Klasselæssere

JVM's første opgaver inkluderer indlæsning, verificering og sammenkædning af bytecode. Klasselæssere håndterer disse opgaver.

Vi har en detaljeret artikel specifikt om klasselæssere.

2.2. Run-Time Data Areas

JVM definerer forskellige hukommelsesområder for at udføre et Java-program. Disse bruges under runtime og er kendt som runtime-dataområder. Nogle af disse områder oprettes ved JVM-opstart og ødelægges, når JVM'en forlader, mens nogle oprettes, når en tråd oprettes og ødelægges, når en tråd kommer ud.

Lad os overveje disse områder en efter en:

Metodeområde

Dybest set er metodeområdet analogt med lagerområdet for kompileret kode. Den gemmer strukturer såsom kørselstid konstant pool, felt- og metodedata, koden til metoder og konstruktører samt fuldt kvalificerede klassenavne. JVM gemmer disse strukturer til hver klasse.

Metodeområdet, også kendt som permanent generation (PermGen), oprettes, når JVM starter op. Hukommelsen til dette område behøver ikke at være sammenhængende. Alle JVM-tråde deler dette hukommelsesområde.

Bunkeområde

JVM tildeler hukommelsen til alle klasseinstanser og arrays fra dette område.

Garbage Collector (GC) genvinder bunkehukommelsen til objekter. Grundlæggende har GC tre faser til at genvinde hukommelse fra objekter, nemlig. to mindre GC og en større GC.

Højdehukommelsen har tre dele:

  • Eden Space - det er en del af Young Generation-rummet. Når vi opretter et objekt, tildeler JVM hukommelse fra dette rum
  • Survivor Space - det er også en del af Young Generation-rummet. Overlevelsesrummet indeholder eksisterende objekter, der har overlevet de mindre GC-faser i GC
  • Fast plads - dette er også kendt som det gamle generations rum. Det rummer længe overlevende objekter. Dybest set er der indstillet en tærskel for Young Generation-objekter, og når denne tærskel er nået, flyttes disse objekter til fast plads.

JVM opretter bunkeområde, så snart det starter op. Alle trådene i JVM deler dette område. Hukommelsen til bunkeområdet behøver ikke at være sammenhængende.

Stak område

Gemmer data som rammer, og hver ramme gemmer lokale variabler, delvise resultater og indlejrede metodeopkald. JVM opretter stakområdet, når det opretter en ny tråd. Dette område er privat for hver tråd.

Hver post i stakken kaldes Stack Frame eller Activation record. Hver ramme indeholder tre dele:

  • Local Variable Array - indeholder alle de lokale variabler og parametre for metoden
  • Operand Stack - bruges som et arbejdsområde til lagring af mellemliggende beregnings resultat
  • Rammedata - bruges til at gemme delresultater, returnere værdier for metoder og henvisning til Undtagelse tabel, der giver tilsvarende fangstblokinformationer i tilfælde af undtagelser

Hukommelsen til JVM-stakken behøver ikke at være sammenhængende.

PC-registre

Hver JVM-tråd har et separat pc-register, der gemmer adressen på den aktuelt udførte instruktion. Hvis den aktuelt udførte instruktion er en del af den oprindelige metode, er denne værdi udefineret.

Native metode stakke

Native metoder er dem, der er skrevet på andre sprog end Java.

JVM giver mulighed for at kalde disse native metoder. Native metoden stakke er også kendt som "C stakke". De gemmer den oprindelige metodeinformation. Når de oprindelige metoder er sammensat til maskinkoder, bruger de normalt en native metodestak til at holde styr på deres tilstand.

JVM opretter disse stakke, når den opretter en ny tråd. Og således deler JVM-tråde ikke dette område.

2.3. Køremotor

Udførelsesmotor udfører instruktionerne ved hjælp af information, der findes i hukommelsesområderne. Den har tre dele:

Tolk

Når klasselastere har indlæst og verificeret bytecode, udfører tolken bytecode linje for linje. Denne udførelse er ret langsom. Ulempen ved tolken er, at når en metode kaldes flere gange, hver gang der kræves ny fortolkning.

Imidlertid bruger JVM JIT Compiler til at mindske denne ulempe.

Just-In-Time (JIT) kompilator

JIT-compiler kompilerer bytecode for de ofte kaldte metoder til native-kode ved kørselstid. Derfor er det ansvarligt for optimeringen af ​​Java-programmerne.

JVM overvåger automatisk, hvilke metoder der udføres. Når en metode bliver kvalificeret til JIT-kompilering, er den planlagt til kompilering til maskinkode. Denne metode kaldes derefter en varm metode. Denne kompilering til maskinkode sker på en separat JVM-tråd.

Som et resultat afbryder det ikke udførelsen af ​​det aktuelle program. Efter kompilering til maskinkode kører den hurtigere.

Skraldemand

Java tager sig af hukommelsesstyring ved hjælp af Garbage Collection. Det er en proces med at se på bunkehukommelse, identificere hvilke objekter der er i brug og hvilke der ikke er, og til sidst slette ubrugte objekter.

GC er en dæmontråd. Det kan kaldes eksplicit ved hjælp af System.gc() metode, men den vil ikke blive udført med det samme, og JVM beslutter, hvornår GC skal påberåbes.

2.4. Java Native Interface

Det fungerer som en grænseflade mellem Java-koden og de oprindelige (C / C ++) biblioteker.

Der er situationer, hvor Java alene ikke opfylder behovene til din applikation, for eksempel implementering af en platformafhængig funktion.

I disse tilfælde kan vi bruge JNI til at aktivere koden, der kører i JVM, til at ringe. Omvendt muliggør det native metoder til at kalde koden, der kører i JVM.

2.5. Indfødte biblioteker

Disse er platformsspecifikke biblioteker og indeholder implementeringen af ​​native metoder.

3. JRE

Java Runtime Environment (JRE) er et bundt af softwarekomponenter, der bruges til at køre Java-applikationer.

Kernekomponenterne i JRE inkluderer:

  • En implementering af en Java Virtual Machine (JVM)
  • Klasser, der kræves for at køre Java-programmerne
  • Ejendomsfiler

Vi diskuterede JVM i ovenstående afsnit. Her vil vi fokusere på kerneklasser og supportfiler.

3.1. Bootstrap-klasser

Vi finder bootstrap-klasser under jre / lib /. Denne sti er også kendt som bootstrap classpath. Det omfatter:

  • Kørselstimer i rt.jar
  • Internationaliseringskurser i i18n.jar
  • Tegnkonverteringsklasser i charsets.jar
  • Andre

Bootstrap ClassLoader indlæser disse klasser, når JVM starter.

3.2. Udvidelseskurser

Vi kan finde udvidelseskurser i jre / lib / extn / som fungerer som en mappe til udvidelser til Java-platformen. Denne sti er også kendt som udvidelses klassesti.

Den indeholder JavaFX runtime-biblioteker i jfxrt.jar og lokale data for java.text og java.util pakker i localedata.jar. Brugere kan også tilføje brugerdefinerede krukker i denne mappe.

3.3. Ejendomsindstillinger

Java-platformen bruger disse egenskabsindstillinger til at opretholde sin konfiguration. Afhængigt af deres anvendelse er de placeret i forskellige mapper indeni / jre / lib /. Disse inkluderer:

  • Kalenderkonfigurationer i kalender. ejendomme
  • Logningskonfigurationer i logging.properties
  • Netværkskonfigurationer i net.egenskaber
  • Implementeringsegenskaber i / jre / lib / deploy /
  • Ledelsesegenskaber i / jre / lib / management /

3.4. Andre filer

Bortset fra de ovennævnte filer og klasser indeholder JRE også filer til andre forhold:

  • Sikkerhedsstyring hos jre / lib / sikkerhed
  • Mappen til placering af supportklasser til applets på jre / lib / applet
  • Fontrelaterede filer på jre / lib / skrifttyper og andre

4. JDK

Java Development Kit (JDK) giver miljø og værktøjer til udvikling, kompilering, fejlretning og udførelse af et Java-program.

Kernekomponenter i JDK inkluderer:

  • JRE
  • Udviklingsværktøjer

Vi diskuterede JRE i ovenstående afsnit.

Nu vil vi fokusere på forskellige udviklingsværktøjer. Lad os kategorisere disse værktøjer baseret på deres brug:

4.1. Grundlæggende værktøjer

Disse værktøjer lægger grundlaget for JDK og bruges til at oprette og opbygge Java-applikationer. Blandt disse værktøjer kan vi finde hjælpeprogrammer til kompilering, fejlretning, arkivering, generering af Javadocs osv.

De omfatter:

  • javac - læser klasse- og interface-definitioner og kompilerer dem til klassefiler
  • java - starter Java-applikationen
  • javadoc - genererer HTML-sider med API-dokumentation fra Java-kildefiler
  • apt - finder og udfører annoteringsprocessorer baseret på de kommentarer, der findes i sættet med specificerede kildefiler
  • appletviewer - gør det muligt for os at køre Java-applets uden en webbrowser
  • krukke - pakker Java-applets eller applikationer i et enkelt arkiv
  • jdb - et fejlfindingsværktøj til kommandolinjer, der bruges til at finde og rette fejl i Java-applikationer
  • javah - producerer C-header og kildefiler fra en Java-klasse
  • javap - adskiller klassefilerne og viser oplysninger om felter, konstruktører og metoder, der findes i en klassefil
  • extcheck - registrerer versionskonflikter mellem mål Java Archive (JAR) -fil og aktuelt installerede JAR-filtypenavne

4.2. Sikkerhedsværktøjer

Disse inkluderer nøgle- og certifikatstyringsværktøjer, der bruges til at manipulere Java Keystores.

En Java Keystore er en container til autorisationscertifikater eller offentlige nøglecertifikater. Derfor bruges det ofte af Java-baserede applikationer til kryptering, godkendelse og servering via HTTPS.

De hjælper også med at indstille sikkerhedspolitikkerne på vores system og oprette applikationer, der kan arbejde inden for rammerne af disse politikker i produktionsmiljøet. Disse inkluderer:

  • nøgleværktøj - hjælper med at administrere nøglelagerindgange, nemlig kryptografiske nøgler og certifikater
  • jarsigner - genererer digitalt signerede JAR-filer ved hjælp af keystore-oplysninger
  • politiværktøj - giver os mulighed for at administrere de eksterne politikkonfigurationsfiler, der definerer installationens sikkerhedspolitik

Nogle sikkerhedsværktøjer hjælper også med at administrere Kerberos-billetter.

Kerberos er en netværksgodkendelsesprotokol.

Det fungerer på basis af billetter for at tillade noder, der kommunikerer over et ikke-sikkert netværk for at bevise deres identitet for hinanden på en sikker måde:

  • kinit - bruges til at skaffe og cache Kerberos-billetter, der tildeles billetter
  • ktab - administrerer principnavne og nøglepar i nøgletabellen
  • klist - viser poster i den lokale legitimationsoplysninger cache og nøgletabel

4.3. Internationaliseringsværktøj

Internationalisering er processen med at designe en applikation, så den kan tilpasses forskellige sprog og regioner uden tekniske ændringer.

Til dette formål bringer JDK native2ascii. Dette værktøj konverterer en fil med tegn understøttet af JRE til filer kodet i ASCII- eller Unicode-undslip.

4.4. Remote Method Invocation (RMI) -værktøjer

RMI-værktøjer muliggør fjernkommunikation mellem Java-applikationer og giver dermed mulighed for udvikling af distribuerede applikationer.

RMI gør det muligt for et objekt, der kører i en JVM, at påkalde metoder på et objekt, der kører i en anden JVM. Disse værktøjer inkluderer:

  • rmic - genererer stub-, skelet- og bindeklasser til eksterne objekter ved hjælp af Java Remote Method Protocol (JRMP) eller Internet Inter-Orb Protocol (IIOP)
  • registre - opretter og starter ekstern objektregistrering
  • rmid - starter aktiveringssystemets dæmon. Dette gør det muligt at registrere og aktivere objekter på en Java Virtual Machine
  • serialver - returnerer seriel version UID for specificerede klasser

4.5. Java IDL- og RMI-IIOP-værktøjer

Java Interface Definition Language (IDL) tilføjer Common Object-Based Request Broker Architecture (CORBA) kapacitet til Java-platformen.

Disse værktøjer gør det muligt for distribuerede Java-webapplikationer at påberåbe sig operationer på eksterne netværkstjenester ved hjælp af industristandard Object Management Group (OMG) - IDL.

På samme måde kunne vi bruge Internet InterORB Protocol (IIOP).

RMI-IIOP, dvs. RMI over IIOP muliggør programmering af CORBA-servere og applikationer via RMI API. Dermed muliggør forbindelse mellem to applikationer skrevet på et hvilket som helst CORBA-kompatibelt sprog via Internet InterORB Protocol (IIOP).

Disse værktøjer inkluderer:

  • tnameserv - transient Naming Service, der giver en trestruktureret mappe til objektreferencer
  • idlj - IDL-til-Java-kompilatoren til generering af Java-bindinger til en specificeret IDL-fil
  • orbd - gøre det muligt for klienter at finde og påberåbe sig vedvarende objekter på serveren i CORBA-miljøet
  • servertool - giver kommandolinjegrænseflade til at registrere eller afregistrere en vedvarende server med ORB Daemon (orbd), start og luk en vedvarende server, der er registreret med ORB Daemon osv

4.6. Java-installationsværktøjer

Disse værktøjer hjælper med at implementere Java-applikationer og applets på nettet. De omfatter:

  • pakke200 - omdanner en JAR-fil til en pakke200 fil ved hjælp af Java gzip kompressor
  • udpakke200 - transformerer pakke200 fil til en JAR-fil

4.7. Java-plugin-værktøj

JDK forsyner os med htmlkonverter. Desuden bruges den sammen med Java Plug-in.

På den ene side opretter Java Plug-in en forbindelse mellem populære browsere og Java-platformen. Som et resultat af denne forbindelse kan applets på webstedet køre i en browser.

På den anden side, htmlkonverter er et værktøj til konvertering af en HTML-side, der indeholder applets til et format til Java Plug-in.

4.8. Java Web Start-værktøj

JDK bringer javaws. Vi kan bruge det i forbindelse med Java Web Start.

Dette værktøj giver os mulighed for at downloade og starte Java-applikationer med et enkelt klik fra browseren. Derfor er der ikke behov for at køre nogen installationsproces.

4.9. Overvågnings- og styringsværktøjer

Dette er gode værktøjer, som vi kan bruge til at overvåge JVM-ydelse og ressourceforbrug. Her er et par af disse:

  • jconsole - giver en grafisk konsol, der lader dig overvåge og administrere Java-applikationer
  • jps - viser de instrumenterede JVM'er på målsystemet
  • jstat - overvåger JVM-statistik
  • jstatd - overvåger oprettelse og afslutning af instrumenterede JVM'er

4.10. Fejlfindingsværktøjer

Dette er eksperimentelle værktøjer, som vi kan bruge til fejlfinding af opgaver:

  • info - genererer konfigurationsoplysninger til en bestemt Java-proces
  • jmap - udskriver hukommelseskort for delt objekt eller bunkehukommelsesoplysninger for en bestemt proces
  • jsadebugd - vedhæftes en Java-proces og fungerer som en fejlretningsserver
  • jstack - udskriver Java stack-spor af Java-tråde til en given Java-proces

5. Konklusion

I denne artikel identificerede vi, at den grundlæggende forskel mellem JVM, JRE og JDK ligger i deres anvendelse.

Først beskrev vi, hvordan JVM er en abstrakt computermaskine, der faktisk udfører Java-bytecode.

Derefter forklarede vi, hvordan man bare kører Java-applikationer, vi bruger JRE.

Og endelig forstod vi, hvordan man udvikler Java-applikationer, vi bruger JDK.

Vi tog os også lidt tid til at grave i værktøjer og grundlæggende koncepter for disse komponenter.