Vad är JVM? Introduktion till Java Virtual Machine

Java Virtual Machine är ett program vars syfte är att köra andra program. Det är en enkel idé som också står som ett av våra största exempel på kodning av kung fu . JVM stör upp status quo för sin tid och fortsätter att stödja programmeringsinnovation idag.

Vad JVM används för

JVM har två primära funktioner: att låta Java-program köras på valfri enhet eller operativsystem (känd som "Skriv en gång, kör var som helst" -principen) och att hantera och optimera programminnet. När Java släpptes 1995 skrevs alla datorprogram till ett specifikt operativsystem och programminnet hanterades av programutvecklaren. Så JVM var en uppenbarelse.

JavaWorld /

Att ha en teknisk definition för JVM är användbar, och det finns också ett vardagligt sätt som programutvecklare tänker på. Låt oss bryta ner dem:

  • Teknisk definition : JVM är specifikationen för ett program som kör kod och tillhandahåller runtime-miljön för den koden.
  • Daglig definition : JVM är hur vi kör våra Java-program. Vi konfigurerar JVM: s inställningar och förlitar oss sedan på den för att hantera programresurser under körning.

När utvecklare pratar om JVM menar vi vanligtvis processen som körs på en maskin, särskilt en server, som representerar och styr resursanvändningen för en Java-app. Kontrastera detta med JVM-specifikationen , som beskriver kraven för att bygga ett program som utför dessa uppgifter.

Vem utvecklar och underhåller JVM?

JVM används i stor utsträckning, används mycket och underhålls av några mycket ljusa programmerare, både företags och öppen källkod. OpenJDK-projektet är avkomman till Sun Microsystems beslut om öppen källkod Java. OpenJDK har fortsatt genom Oracles förvaltning av Java, med mycket av det tunga lyftet i dag gjort av Oracle ingenjörer.

Minneshantering i JVM

Den vanligaste interaktionen med en pågående JVM är att kontrollera minnesanvändningen i högen och stacken. Den vanligaste justeringen är att ställa in JVM: s minnesinställningar.

Skräp samling

Innan Java hanterades allt programminne av programmeraren. I Java hanteras programminnet av JVM. JVM hanterar minne genom en process som kallas skräpsamling , som kontinuerligt identifierar och eliminerar oanvänt minne i Java-program. Insamling av skräp sker i en pågående JVM.

I början kom Java mycket kritik för att han inte var så "nära metallen" som C ++, och därför inte så snabb. Avfallshanteringsprocessen var särskilt kontroversiell. Sedan dess har en mängd algoritmer och tillvägagångssätt föreslagits och använts för sopuppsamling. Med konsekvent utveckling och optimering har sopuppsamlingen förbättrats avsevärt.

Vad betyder "nära metallen"?

När programmerare säger att ett programmeringsspråk eller en plattform är "nära metallen" menar vi att utvecklaren kan programmera (genom att skriva kod) hantera ett operativsystems minne. I teorin kan programmerare vrida mer prestanda ur våra program genom att ange hur mycket som används och när de ska kasseras. I de flesta fall ger delegering av minneshantering till en mycket förfinad process som JVM bättre prestanda och färre fel än att göra det själv.

JVM i tre delar

Man kan säga att det finns tre aspekter av JVM: specifikation, implementering och instans. Låt oss överväga var och en av dessa.

1. JVM-specifikationen

För det första är JVM en mjukvaruspecifikation. På ett något cirkulärt sätt framhäver JVM-specifikationen att dess implementeringsdetaljer inte definieras inom specifikationen för att möjliggöra maximal kreativitet i dess förverkligande:

"För att implementera den virtuella Java-maskinen korrekt behöver du bara kunna läsa classfilformatet och korrekt utföra de åtgärder som anges där."

JS Bach beskrev en gång att skapa musik på samma sätt:

"Allt du behöver göra är att peka på rätt tangent vid rätt tidpunkt."

Så allt JVM måste göra är att köra Java-program korrekt. Låter enkelt, kan till och med se enkelt utifrån, men det är ett massivt åtagande, särskilt med tanke på Java-språkkraften.

JVM som en virtuell maskin

JVM är en virtuell maskin som kör Java-klassfiler på ett bärbart sätt. Att vara en virtuell maskin betyder att JVM är en abstraktion av en underliggande, faktisk maskin - till exempel servern som ditt program körs på. Oavsett vilket operativsystem eller hårdvara som faktiskt finns, skapar JVM en förutsägbar miljö för program att köras inom. Till skillnad från en riktig virtuell maskin skapar dock JVM inte ett virtuellt operativsystem. Det skulle vara mer exakt att beskriva JVM som en hanterad runtime-miljö eller som en virtuell processmaskin .

2. JVM-implementeringar

Implementering av JVM-specifikationen resulterar i ett verkligt program, vilket är en JVM-implementering. Faktum är att det finns många JVM-implementeringar, både öppen källkod och proprietär. OpenJDKs HotSpot JVM är referensimplementeringen och förblir en av de mest genomprövade kodbaserna i världen. HotSpot är också den vanligaste JVM.

Nästan alla licensierade JVM: er skapas som gafflar från OpenJDK och HotSpot JVM, inklusive Oracles licensierade JDK. Utvecklare som skapar en licensierad gaffel från OpenJDK motiveras ofta av önskan att lägga till OS-specifika prestandaförbättringar. Vanligtvis laddar du ner och installerar JVM som en buntad del av en Java Runtime Environment (JRE).

3. En JVM-instans

Efter att JVM-specifikationen har implementerats och släppts som en mjukvaruprodukt kan du ladda ner och köra den som ett program. Det nedladdade programmet är en instans (eller instantierad version) av JVM.

När utvecklare pratar om "JVM" hänvisar vi oftast till en JVM-instans som körs i en mjukvaruutveckling eller produktionsmiljö. Du kan säga "Hej Anand, hur mycket minne använder JVM på den servern?" eller, "Jag kan inte tro att jag skapade ett cirkulärt samtal och ett stacköverskridningsfel kraschade min JVM. Vilket nybörjarfel!"

Vad är en mjukvaruspecifikation?

En mjukvaruspecifikation (eller specifikation) är ett läsbart designdokument som beskriver hur ett mjukvarusystem ska fungera. Syftet med en specifikation är att skapa en tydlig beskrivning och krav för ingenjörer att koda till.

Laddar och kör klassfiler i JVM

Vi har pratat om JVM: s roll i att köra Java-applikationer, men hur utför den sin funktion? För att köra Java-applikationer beror JVM på Java-klasslastaren och en Java-exekveringsmotor.

Java-klasslastaren i JVM

Allt i Java är en klass, och alla Java-applikationer är byggda från klasser. En applikation kan bestå av en klass eller tusentals. För att kunna köra ett Java-program måste en JVM ladda kompilerade .class-filer i ett sammanhang, till exempel en server, där de kan nås. En JVM är beroende av sin klasslastare för att utföra denna funktion.

Java-klasslastaren är den del av JVM som laddar klasser i minnet och gör dem tillgängliga för körning. Klasslastare använder tekniker som lat laddning och cachning för att göra klasslastning så effektiv som möjligt. Med det sagt är klassladdning inte den episka hjärnan som (säg) bärbar runtime-minneshantering är, så teknikerna är relativt enkla.

Varje Java Virtual Machine innehåller en klasslastare. JVM-specifikationen beskriver standardmetoder för att fråga och manipulera klasslastaren vid körning, men JVM-implementeringar är ansvariga för att uppfylla dessa funktioner. Ur utvecklarens perspektiv är de underliggande klassladdningsmekanismerna vanligtvis en svart ruta.

Körningsmotorn i JVM

När klasslastaren har gjort sitt arbete med att ladda klasser börjar JVM att köra koden i varje klass. Den motor utförande är JVM komponent som hanterar denna funktion. Exekveringsmotorn är väsentlig för den pågående JVM. För alla praktiska ändamål är det faktiskt JVM-instansen.

Utförande av kod innebär hantering av åtkomst till systemresurser. JVM-exekveringsmotorn står mellan det körande programmet - med sina krav på fil-, nätverks- och minnesresurser - och operativsystemet som levererar dessa resurser.

Hur exekveringsmotorn hanterar systemresurser

Systemresurser kan delas in i två breda kategorier: minne och allt annat.

Kom ihåg att JVM är ansvarig för att bortskaffa oanvänt minne och att skräpsamling är den mekanism som gör det bortskaffandet. JVM ansvarar också för tilldelning och underhåll av referensstrukturen som utvecklaren tar för givet. Som ett exempel är JVM: s exekveringsmotor ansvarig för att ta något som newnyckelordet i Java och göra det till en OS-specifik begäran om minnestilldelning.

Utöver minnet hanterar körningsmotorn resurser för filsystemåtkomst och nätverks I / O. Eftersom JVM är driftskompatibelt över operativsystem, är det ingen uppgift. Förutom varje applikations resursbehov måste körningsmotorn vara lyhörd för varje OS-miljö. Det är så JVM kan hantera naturliga krav.

JVM-utveckling: förflutna, nutid, framtid

1995 introducerade JVM två revolutionerande koncept som sedan dess har blivit standardpris för modern programvaruutveckling: "Skriv en gång, kör var som helst" och automatisk minneshantering. Programvaruoperabilitet var ett djärvt koncept vid den tiden, men få utvecklare idag skulle tänka två gånger om det. På samma sätt, medan våra tekniska förfäder var tvungna att hantera programminnet själva, växte min generation upp med skräpsamling.

Vi kan säga att James Gosling och Brendan Eich uppfann modern programmering, men tusentals andra har förfinat och byggt på sina idéer under de följande decennierna. Medan Java Virtual Machine ursprungligen bara var för Java, har den idag utvecklats för att stödja många skripts- och programmeringsspråk, inklusive Scala, Groovy och Kotlin. Ser vi framåt är det svårt att se en framtid där JVM inte är en framträdande del av utvecklingslandskapet.

Allt om JVM

  • Java-utmanare: Trådbeteende i JVM
  • Java-utmanare: Metodöverbelastning i JVM
  • Inuti JVM-prestandaoptimering
  • Grunderna i Bytecode: Hur JVM hanterar bytecode
  • Java-undantag: Hur JVM hanterar undantag
  • Vi presenterar den magra, genomsnittliga Java-maskinen

Denna berättelse, "What is the JVM? Introducing the Java Virtual Machine" publicerades ursprungligen av JavaWorld.