Introduktion till Java Virtual Machine
I den här artikeln kommer vi att lära dig om Java Virtual Machine, alias “JVM”. Java Virtual Machine är en virtuell maskin som gör att ett datorsystem kan köra / köra Java-program. I grund och botten är JVM en motor som fungerar som en runtime-miljö för Java-kod. JVM konverterar java-koden till maskinspråk. När du kör en sammanställd .class-fil går den till JVM och sedan returnerar JVM utdata. Java Virtual Machine är en del av JRE, som står för “Java Runtime Environment”. Grundläggande uppgifter för en Java Virtual Machine består av att ladda koden, sedan verifiera koden och köra koden. Ge också runtime-miljön för körning av kod. JVM består av olika komponenter som Classloader, Lista över utrymme som tilldelats av JVM som Stack, en exekveringsmotor och några få infödda bibliotek.
Arkitekturen av Java Virtual Machine 
Som visas på bilden ovan består Java Virtual Machine Architecture av olika komponenter. Låt oss lära oss om varje specifik komponent individuellt.
Lastare
Som namnet antyder är det en komponent som ansvarar för att ladda klassfiler. Laddar, länkar och initialiserar en klassfil är de viktigaste funktionerna i Loader. Lastaren fungerar under körning.
- Laddar: I princip läser läsaren .klass-filen, genererar sedan den binära koden och sparar den i ett metodområde. Bootstrap Classloader, Extension Classloader och Application Classloader är de olika ClassLoadrarna som ansvarar för att ladda olika klasser.
- Länk: Tre huvudfunktioner som verifiering, förberedelse och lösning. Det börjar med .klassverifiering. Om verifieringen misslyckas ger det undantag för verifiering av körtid. Senare tilldelas minne till variablerna med standardvärden. Därefter, slutligen, ersätts de symboliska minnesreferenserna med direkt referens från minnesområdet.
- Initiera: Detta är en sista del av ClassLoader. Originalvärden tilldelas alla statiska variabler, följt av exekveringen av statisk block. Denna del körs från toppen till botten av en klass.
Högen
Detaljer om ett objekt- och instansvariabler lagras alla här. Det är ett delat minnesområde, vilket innebär att informationen som lagras här inte är trådsäker.
Undantag i tråd “main” java.lang.OutOfMemoryError: Java heap space
Ett av de mest relatabla felen är undantaget “OutOfMemoryError ”, vilket innebär att JVM inte kan tilldela ett objekt i Heap-området eller att minnesallokering inte kan göras för samma objekt.
Stack
Det är här en separat runtime-stack skapas för varje ny tråd. Även känd som en Run-Time Stack, varje gång en metod begärs lagras alla detaljer i motsvarande runtime-stativ och efter avslutad metod tas dessa detaljer bort från stacken.
PC-register
För varje tråd skapas ett separat datorregister (Programräknare) som lagrar adressen till den aktuella exekveringsinstruktionen, som senare kommer att uppdateras med nästa instruktion. Det här minnesområdet är ganska litet och har fast storlek.
Native Method Stack
Det är ett av sina egna typer av minnesområden, som åberopas av en tråd och sedan är tråden i en helt ny nivå där struktur och säkerhetsbegränsningar som impliceras av Java Virtual Machine inte längre är i träning. Jämfört med andra körtidsminnesområden har minnet som används av de inbyggda metodstaplarna ingen fast storlek utan några begränsningar i inkrement eller minskning.
Java Native Interface
JNI interagerar helt enkelt med nedan nämnda Native Method Libraries som har C, C ++ -implementering och ger samma till exekveringsmotorn. Direkt åtkomst till monteringskod tillåts av JNI. För en JVM är Java och Native de två typerna av koder. JNI upprättar smidigt en väldefinierad länk mellan dessa två.
Native Method Libraries
Insamling av infödda bibliotek, enligt exekveringsmotorn.
Exekveringsmotor
Nåväl, nu har vi java-program till bytecode, som tilldelas de ovan förklarade dataområdena via en klasslastare, och nu kommer bytekoden att köras av exekveringsmotorn. Execution Engine läser helt enkelt bytekoden i enheter, som en maskin som läser kodrader en efter en. Bytekoden är ett mänskligt läsbart format, varför maskinen inte kan läsa den har den är och måste konverteras till ett maskinläsbart format, där komponenterna nedan används för tolkningsändamålet.
Execution Engine har tre huvudkomponenter, som är tolk, JIT Compiler och en Garbage Collector.
1. Tolk
Kör helt enkelt bytekoden i en sekventiell metod. Ett samtal görs av en kommandoradsfråga med en sammanställd fil som ett argument. Tolken är ganska snabb när det gäller att tolka och köra kommandon en efter en, vilket händer snabbare än JIT-kompilatorn för att kompilera koden.
java klassnamn
En huvudklass () är ett måste i en sammanställd .klassfil.
2. JIT Compiler
En av de viktigaste komponenterna i Java Runtime Environment, som förbättrar Java-applikationsprestanda vid körning. Ingen annan komponent har större påverkan på prestanda än JIT Compiler. Detta är en standardkompilerare och aktiveras när någon Java-metod anropas.
3. Garbage Collector
Som namnet antyder har det något att göra med skräp, Garbage Collector söker helt enkelt efter alla möjliga objekt som finns tillgängliga i JVM-högutrymmet, kontrollerar om det är i användning och raderar sedan de oanvända objekten. Så det markerar helt enkelt de minnesbitar som används eller inte. Sedan fortsätter det att svepa, där det helt enkelt tar bort det markerade objektet. Det bästa användningsfallet är att inget manuellt allokeringssystem behövs eftersom Garbage Collector gör jobbet med att ta bort outnyttjat minnesutrymme automatiskt. Men eftersom detta är en automatisk uppgift har ingen programmerare kontroll över schemaläggning av någon tidslucka för specifikt rengöringsuppgift och kräver mer CPU-kraft när den söker efter objektreferenser.
Slutsats
Även om det inte är obligatoriskt att ha en klar förståelse för hur JVM fungerar, för att skriva Java-kod, är det oerhört bra. För en utvecklare som förstår hur JVM fungerar kommer han att skriva bättre och optimerad kod, hur länge eller komplicerat kravet är. Förutom beskrivningen som tillhandahålls här, tillhandahåller JVM ett brett utbud av funktioner och tekniker. Dessa funktioner kan användas för att förbättra prestanda efter behov av en specifik leverantör
Rekommenderade artiklar
Detta är en guide till Java Virtual Machine. Här diskuterar vi arkitekturen för virtuell java-maskin tillsammans med dess olika komponenter. Du kan också titta på följande artiklar för att lära dig mer -
- Bubble Sortera i JavaScript
- Tråd livscykel i Java
- Vad är Java SE?
- Bästa Java-kompilatorer
- JRE vs JVM | Topp 8 skillnader med (Infographics)