Forskjellen mellom JVM, JRE og JDK

1. Oversikt

I denne artikkelen vil vi diskutere forskjeller mellom JVM, JRE og JDK ved å vurdere komponentene og bruken av dem.

2. JVM

Java Virtual Machine (JVM) er en implementering av en virtuell maskin som utfører et Java-program.

JVM tolker først bytekoden. Den lagrer deretter klasseinformasjonen i minneområdet. Til slutt kjører den bytekoden generert av Java-kompilatoren.

Det er en abstrakt datamaskin med eget instruksjonssett og manipulerer forskjellige minneområder ved kjøretid.

Komponenter i JVM er:

  • Klasselastere
  • Kjøretidsdataområder
  • Utførelsesmotor

2.1. Klasselastere

De første oppgavene til JVM inkluderer lasting, verifisering og kobling av bytekoden. Klasselastere håndterer disse oppgavene.

Vi har en detaljert artikkel om klasselaster.

2.2. Kjøretidsdataområder

JVM definerer forskjellige minneområder for å utføre et Java-program. Disse brukes under kjøretid og er kjent som kjøretidsdataområder. Noen av disse områdene blir opprettet ved oppstart av JVM og ødelagt når JVM går ut mens noen opprettes når en tråd opprettes og ødelegges når en tråd kommer ut.

La oss vurdere disse områdene en etter en:

Metodeområde

I utgangspunktet er metodeområdet analogt med lagringsområdet for kompilert kode. Den lagrer strukturer som løpende konstant basseng, felt- og metodedata, koden for metoder og konstruktører samt fullt kvalifiserte klassenavn. JVM lagrer denne strukturen for hver klasse.

Metodeområdet, også kjent som permanent generasjonsrom (PermGen), opprettes når JVM starter opp. Hukommelsen for dette området trenger ikke å være sammenhengende. Alle JVM-trådene deler dette minneområdet.

Haugområde

JVM tildeler minnet til alle klasseinstanser og matriser fra dette området.

Garbage Collector (GC) gjenvinner haugeminnet for objekter. I utgangspunktet har GC tre faser for å gjenvinne minne fra objekter, nemlig. to mindre GC og en større GC.

Haugeminnet har tre deler:

  • Eden Space - det er en del av Young Generation-rommet. Når vi oppretter et objekt, tildeler JVM minne fra dette rommet
  • Survivor Space - det er også en del av Young Generation-rommet. Survivor space inneholder eksisterende objekter som har overlevd de mindre GC-fasene i GC
  • Tenured Space - dette er også kjent som Old Generation-rommet. Den har lenge gjenlevende gjenstander. I utgangspunktet settes en terskel for Young Generation-objekter, og når denne terskelen er oppfylt, flyttes disse objektene til fast plass.

JVM oppretter haugeareal så snart det starter opp. Alle trådene til JVM deler dette området. Hukommelsen til haugområdet trenger ikke å være sammenhengende.

Stakk område

Lagrer data som rammer, og hver ramme lagrer lokale variabler, delvise resultater og nestede metodeanrop. JVM oppretter stabelområdet når det oppretter en ny tråd. Dette området er privat for hver tråd.

Hver oppføring i stabelen kalles Stack Frame eller Activation record. Hver ramme inneholder tre deler:

  • Local Variable Array - inneholder alle lokale variabler og parametere for metoden
  • Operand Stack - brukes som arbeidsområde for lagring av resultat for mellomberegning
  • Rammedata - brukes til å lagre delvise resultater, returnere verdier for metoder og referanse til Unntak tabell som gir tilsvarende fangstblokkinformasjon i tilfelle unntak

Minnet til JVM-stakken trenger ikke å være sammenhengende.

PC-registre

Hver JVM-tråd har et eget PC-register som lagrer adressen til den utførte instruksjonen. Hvis den nåværende utførende instruksjonen er en del av den opprinnelige metoden, er denne verdien udefinert.

Innfødte metode stabler

Innfødte metoder er de som er skrevet på andre språk enn Java.

JVM tilbyr muligheter for å kalle disse innfødte metodene. Innfødte metodestabler er også kjent som “C-stabler”. De lagrer den opprinnelige metodeinformasjonen. Hver gang de innfødte metodene blir samlet i maskinkoder, bruker de vanligvis en innfødt metodestabel for å holde rede på tilstanden deres.

JVM oppretter disse stakkene når den oppretter en ny tråd. Og dermed deler ikke JVM-tråder dette området.

2.3. Utførelsesmotor

Kjøremotoren utfører instruksjonene ved hjelp av informasjon som er tilstede i minneområdene. Den har tre deler:

Tolk

Når klasselastere laster inn og verifiserer bytecode, utfører tolken bytecode linje for linje. Denne utførelsen er ganske treg. Ulempen med tolk er at når en metode kalles flere ganger, hver gang ny tolkning er nødvendig.

Imidlertid bruker JVM JIT Compiler for å redusere denne ulempen.

Just-In-Time (JIT) kompilator

JIT-kompilator kompilerer bytekoden til de ofte kalte metodene til opprinnelig kode ved kjøretid. Derfor er det ansvarlig for optimaliseringen av Java-programmene.

JVM overvåker automatisk hvilke metoder som utføres. Når en metode blir kvalifisert for JIT-kompilering, er den planlagt for kompilering til maskinkode. Denne metoden er da kjent som en varm metode. Denne samlingen til maskinkode skjer på en egen JVM-tråd.

Som et resultat forstyrrer det ikke gjennomføringen av det gjeldende programmet. Etter kompilering til maskinkode går den raskere.

Søppelmann

Java tar seg av minnestyring ved hjelp av søppelinnsamling. Det er en prosess med å se på haugeminne, identifisere hvilke objekter som er i bruk og hvilke som ikke er, og til slutt slette ubrukte objekter.

GC er en demonstråd. Det kan kalles eksplisitt ved hjelp av System.gc() metoden, vil den imidlertid ikke kjøres umiddelbart, og JVM bestemmer når GC skal påkalles.

2.4. Native Java-grensesnitt

Den fungerer som et grensesnitt mellom Java-koden og de innfødte (C / C ++) biblioteker.

Det er situasjoner der Java alene ikke oppfyller behovene for applikasjonen din, for eksempel implementering av en plattformavhengig funksjon.

I slike tilfeller kan vi bruke JNI til å aktivere koden som kjører i JVM for å ringe. Omvendt gjør det det mulig for innfødte metoder å ringe koden som kjører i JVM.

2.5. Innfødte biblioteker

Dette er plattformspesifikke biblioteker og inneholder implementeringen av innfødte metoder.

3. JRE

Java Runtime Environment (JRE) er en pakke med programvarekomponenter som brukes til å kjøre Java-applikasjoner.

Kjernekomponentene i JRE inkluderer:

  • En implementering av en Java Virtual Machine (JVM)
  • Klasser som kreves for å kjøre Java-programmene
  • Eiendomsfiler

Vi diskuterte JVM i avsnittet ovenfor. Her vil vi fokusere på kjerneklasser og støttefiler.

3.1. Bootstrap-klasser

Vi finner bootstrap-klasser under jre / lib /. Denne banen er også kjent som bootstrap classpath. Det inkluderer:

  • Runtime-klasser i rt.jar
  • Internasjonaliseringskurs i i18n.jar
  • Tegnkonverteringsklasser i charsets.jar
  • Andre

Bootstrap ClassLoader laster disse klassene når JVM starter opp.

3.2. Utvidelseskurs

Vi kan finne utvidelsestimer i jre / lib / extn / som fungerer som en katalog for utvidelser av Java-plattformen. Denne stien er også kjent som utvidelsesklassevei.

Den inneholder JavaFX kjøretidsbiblioteker i jfxrt.jar og lokale data for java.text og java.util pakker i localedata.jar. Brukere kan også legge til egendefinerte krukker i denne katalogen.

3.3. Eiendomsinnstillinger

Java-plattformen bruker disse eiendomsinnstillingene for å opprettholde konfigurasjonen. Avhengig av bruken de ligger i forskjellige mapper inne / jre / lib /. Disse inkluderer:

  • Kalenderkonfigurasjoner i kalender. eiendommer
  • Loggkonfigurasjoner i logging.egenskaper
  • Nettverkskonfigurasjoner i netto eiendommer
  • Implementeringsegenskaper i / jre / lib / deploy /
  • Forvaltningsegenskaper i / jre / lib / management /

3.4. Andre filer

Bortsett fra de ovennevnte filene og klassene, inneholder JRE også filer for andre forhold:

  • Sikkerhetsadministrasjon kl jre / lib / sikkerhet
  • Katalogen for plassering av støtteklasser for applets på jre / lib / applet
  • Fontrelaterte filer på jre / lib / fonter og andre

4. JDK

Java Development Kit (JDK) gir miljø og verktøy for å utvikle, kompilere, feilsøke og utføre et Java-program.

Kjernekomponenter i JDK inkluderer:

  • JRE
  • Utviklingsverktøy

Vi diskuterte JRE i avsnittet ovenfor.

Nå vil vi fokusere på ulike utviklingsverktøy. La oss kategorisere disse verktøyene basert på deres bruk:

4.1. Grunnleggende verktøy

Disse verktøyene legger grunnlaget for JDK og brukes til å lage og bygge Java-applikasjoner. Blant disse verktøyene kan vi finne verktøy for kompilering, feilsøking, arkivering, generering av Javadocs, etc.

De inkluderer:

  • javac - leser klasse- og grensesnittdefinisjoner og kompilerer dem til klassefiler
  • java - starter Java-applikasjonen
  • javadoc - genererer HTML-sider med API-dokumentasjon fra Java-kildefiler
  • apt - finner og utfører merkeprosessorer basert på merknadene i settet med spesifiserte kildefiler
  • appletviewer - gjør det mulig for oss å kjøre Java-appletter uten nettleser
  • krukke - pakker Java-applikasjoner eller applikasjoner i ett arkiv
  • jdb - et feilsøkingsverktøy for kommandolinje som brukes til å finne og fikse feil i Java-applikasjoner
  • javah - produserer C-header og kildefiler fra en Java-klasse
  • javap - demonterer klassefilene og viser informasjon om felt, konstruktører og metoder som finnes i en klassefil
  • extcheck - oppdager versjonskonflikter mellom mål Java Archive (JAR) -fil og for øyeblikket installerte filtypen JAR-filer

4.2. Sikkerhetsverktøy

Disse inkluderer nøkkel- og sertifikatadministrasjonsverktøy som brukes til å manipulere Java Keystores.

En Java Keystore er en beholder for autorisasjonssertifikater eller offentlige nøkkelsertifikater. Derfor brukes den ofte av Java-baserte applikasjoner for kryptering, autentisering og servering via HTTPS.

De hjelper også med å sette sikkerhetspolitikk på systemet vårt og lage applikasjoner som kan fungere innenfor rammen av disse retningslinjene i produksjonsmiljøet. Disse inkluderer:

  • nøkkelverktøy - hjelper til med å administrere nøkkelbutikkoppføringer, nemlig kryptografiske nøkler og sertifikater
  • jarsigner - genererer digitalt signerte JAR-filer ved hjelp av keystore-informasjon
  • politiverktøy - gjør oss i stand til å administrere de eksterne policykonfigurasjonsfilene som definerer installasjonens sikkerhetspolicy

Noen sikkerhetsverktøy hjelper også med å administrere Kerberos-billetter.

Kerberos er en nettverksautentiseringsprotokoll.

Det fungerer på grunnlag av billetter for å tillate noder som kommuniserer over et ikke-sikkert nettverk for å bevise identiteten deres til hverandre på en sikker måte:

  • kinit - brukes til å skaffe og cache Kerberos-billetttildelende billetter
  • ktab - administrerer prinsippnavn og nøkkelpar i nøkkeltabellen
  • klist - viser oppføringer i den lokale legitimasjonsbufferen og nøkkeltabellen

4.3. Internasjonaliseringsverktøy

Internasjonalisering er prosessen med å designe en applikasjon slik at den kan tilpasses forskjellige språk og regioner uten tekniske endringer.

For dette formålet bringer JDK innfødt2ascii. Dette verktøyet konverterer en fil med tegn som støttes av JRE til filer kodet i ASCII- eller Unicode-rømming.

4.4. Verktøy for Remote Method Invocation (RMI)

RMI-verktøy muliggjør fjernkommunikasjon mellom Java-applikasjoner og gir dermed rom for utvikling av distribuerte applikasjoner.

RMI gjør det mulig for et objekt som kjører i en JVM å påkalle metoder på et objekt som kjører i en annen JVM. Disse verktøyene inkluderer:

  • rmic - genererer stub-, skjelett- og bindeklasser for eksterne objekter ved hjelp av Java Remote Method Protocol (JRMP) eller Internet Inter-Orb Protocol (IIOP)
  • rmiregistry - oppretter og starter eksternt objektregister
  • rmid - starter aktiveringssystemdemonen. Dette gjør at objekter kan registreres og aktiveres på en Java Virtual Machine
  • seriell - returnerer seriell versjon UID for spesifiserte klasser

4.5. Java IDL- og RMI-IIOP-verktøy

Java Interface Definition Language (IDL) legger til Common Object-Based Request Broker Architecture (CORBA) -funksjon til Java-plattformen.

Disse verktøyene gjør det mulig for distribuerte Java-webapplikasjoner å påkalle operasjoner på eksterne nettverkstjenester ved hjelp av industristandard Object Management Group (OMG) - IDL.

På samme måte kan vi bruke Internet InterORB Protocol (IIOP).

RMI-IIOP, dvs. RMI over IIOP muliggjør programmering av CORBA-servere og applikasjoner via RMI API. Dermed muliggjør tilkobling mellom to applikasjoner skrevet på et hvilket som helst CORBA-kompatibelt språk via Internet InterORB Protocol (IIOP).

Disse verktøyene inkluderer:

  • tnameserv - transient Naming Service som gir en trestrukturert katalog for objektreferanser
  • idlj - IDL-til-Java-kompilatoren for å generere Java-bindinger for en spesifisert IDL-fil
  • orbd - gjøre det mulig for klienter å finne og påkalle vedvarende objekter på serveren i CORBA-miljøet
  • servertool - gir kommandolinjegrensesnitt for å registrere eller avregistrere en vedvarende server med ORB Daemon (orbd), start og slå av en vedvarende server som er registrert hos ORB Daemon osv

4.6. Java-distribusjonsverktøy

Disse verktøyene hjelper deg med å distribuere Java-applikasjoner og applets på nettet. De inkluderer:

  • pakke200 - forvandler en JAR-fil til en pakke200 filen ved hjelp av Java gzip kompressor
  • pakke ut 200 - forvandler pakke200 fil til en JAR-fil

4.7. Java Plug-in Tool

JDK forsyner oss med htmlconverter. Videre brukes den sammen med Java Plug-in.

På den ene siden oppretter Java Plug-in en forbindelse mellom populære nettlesere og Java-plattformen. Som et resultat av denne tilkoblingen kan applets på nettstedet kjøres i en nettleser.

På den andre siden, htmlconverter er et verktøy for å konvertere en HTML-side som inneholder applets til et format for Java Plug-in.

4.8. Java Web Start Tool

JDK bringer javaws. Vi kan bruke den i forbindelse med Java Web Start.

Dette verktøyet lar oss laste ned og starte Java-applikasjoner med et enkelt klikk fra nettleseren. Derfor er det ikke nødvendig å kjøre noen installasjonsprosess.

4.9. Overvåkings- og styringsverktøy

Dette er gode verktøy som vi kan bruke til å overvåke JVM-ytelse og ressursforbruk. Her er noen av disse::

  • jconsole - gir en grafisk konsoll som lar deg overvåke og administrere Java-applikasjoner
  • jps - viser de instrumenterte JVM-ene på målsystemet
  • jstat - overvåker JVM-statistikk
  • jstatd - overvåker oppretting og avslutning av instrumenterte JVM-er

4.10. Feilsøkingsverktøy

Dette er eksperimentelle verktøy som vi kan bruke for feilsøking av oppgaver:

  • info - genererer konfigurasjonsinformasjon for en spesifisert Java-prosess
  • jmap - skriver ut minnekart for delt objekt eller heapminnedetaljer for en spesifisert prosess
  • jsadebugd - festes til en Java-prosess og fungerer som en feilsøkingsserver
  • jstack - skriver ut Java stack-spor av Java-tråder for en gitt Java-prosess

5. Konklusjon

I denne artikkelen identifiserte vi at den grunnleggende forskjellen mellom JVM, JRE og JDK ligger i bruken av dem.

Først beskrev vi hvordan JVM er en abstrakt datamaskin som faktisk utfører Java bytecode.

Så forklarte vi hvordan du bare skal kjøre Java-applikasjoner, vi bruker JRE.

Og til slutt forsto vi hvordan vi skulle utvikle Java-applikasjoner, vi bruker JDK.

Vi tok oss også litt tid til å grave i verktøy og grunnleggende konsepter for disse komponentene.


$config[zx-auto] not found$config[zx-overlay] not found