Inleiding tot Java Virtual Machine
In dit artikel leren we over Java Virtual Machine, ook bekend als "JVM". Java Virtual Machine is een virtuele machine waarmee een computersysteem Java-programma's kan uitvoeren / uitvoeren. Kortom, JVM is een engine, die werkt als een runtime-omgeving voor Java-code. JVM converteert de Java-code in machinetaal. Wanneer u een gecompileerd .class-bestand uitvoert, gaat het naar JVM en retourneert JVM de uitvoer. Java Virtual Machine is een onderdeel van JRE, wat staat voor "Java Runtime Environment". Basistaken voor een Java Virtual Machine bestaan uit het laden van de code, controleer vervolgens de code en voer de code uit. Zorg ook voor de runtime-omgeving voor het uitvoeren van code. JVM bestaat uit verschillende componenten zoals Classloader, Lijst met door JVM toegewezen ruimte zoals Stack, een Execution Engine en enkele native bibliotheken.
De architectuur van Java Virtual Machine 
Zoals te zien in de afbeelding hierboven, bestaat Java Virtual Machine Architecture uit verschillende componenten. Laten we elk specifiek onderdeel afzonderlijk leren kennen.
lader
Zoals de naam al doet vermoeden, is het een component dat verantwoordelijk is voor het laden van Class-bestanden. Het laden, koppelen en initialiseren van een klassenbestand zijn de belangrijkste functies van de Loader. De lader doet het tijdens runtime.
- Laden: Kortom, de lader leest het .class-bestand, genereert vervolgens de binaire code en slaat deze op in een methodegebied. Bootstrap Classloader, Extension Classloader en Application Classloader zijn de verschillende ClassLoaders die verantwoordelijk zijn voor het laden van verschillende klassen.
- Koppelen: drie belangrijke functies zoals verificatie, voorbereiding en oplossen. Het begint met .class-bestandsverificatie. Als de verificatie mislukt, geeft dit een uitzondering voor runtime-verificatie. Later wordt geheugen toegewezen aan de variabelen met standaardwaarden. Ten slotte worden de symbolische geheugenreferenties vervangen door directe referentie uit het geheugengebied.
- Initialiseren: dit is een laatste onderdeel van ClassLoader. Oorspronkelijke waarden worden toegewezen aan alle statische variabelen, gevolgd door de uitvoering van statisch blok. Dit deel wordt van boven naar beneden in een klasse uitgevoerd.
Hoop
Details van een object en instantievariabelen worden hier allemaal opgeslagen. Het is een gedeeld geheugengebied, wat betekent dat de hier opgeslagen gegevens niet thread-safe zijn.
Uitzondering in thread "main" java.lang.OutOfMemoryError: Java-heapruimte
Een van de meest betrouwbare fouten is de uitzondering "OutOfMemoryError ", wat betekent dat de JVM geen object in het Heap-gebied kan toewijzen of geheugentoewijzing niet voor hetzelfde object kan worden uitgevoerd.
stack
Hier wordt een afzonderlijke runtime-stapel gemaakt voor elke nieuwe thread. Ook bekend als een Run-Time Stack, elke keer dat een methode wordt aangeroepen, worden alle details opgeslagen in de bijbehorende runtime-stand en na het voltooien van de methode worden deze details uit de stapel verwijderd.
PC registers
Voor elke thread wordt een afzonderlijk PC-register (Program Counter) aangemaakt, waarin het adres van de huidige uitvoeringsinstructie wordt opgeslagen, die later wordt bijgewerkt met de volgende instructie. Dit geheugengebied is vrij klein en heeft een vaste grootte.
Native Method Stack
Het is een eigen soort geheugengebied, dat wordt opgeroepen door een thread en de thread bevindt zich op een geheel nieuw niveau waar de structuur en beveiligingsbeperkingen die worden geïmpliceerd door Java Virtual Machine niet langer in gebruik zijn. In vergelijking met andere runtime-geheugengebieden heeft het geheugen bezet door de native methode-stacks geen vaste grootte, zonder beperkingen in op- of aflopende.
Java native interface
JNI werkt eenvoudigweg samen met de hieronder genoemde Native Method Libraries die van C, C ++ implementatie zijn en hetzelfde aan de uitvoeringsengine leveren. Directe toegang tot montagecode is toegestaan door JNI. Voor een JVM zijn Java en native de twee soorten codes. Het JNI legt soepel een goed gedefinieerde link tussen deze twee vast.
Native Method Libraries
Verzameling van native bibliotheken, zoals vereist door de Execution Engine.
Uitvoering Engine
Welnu, we hebben nu het Java-programma in bytecode, dat via een klassenlader aan de hierboven beschreven gegevensgebieden wordt toegewezen, en nu wordt de bytecode uitgevoerd door de uitvoeringsengine. Execution Engine leest eenvoudig de bytecode in eenheden, zoals een machine die coderegels één voor één leest. De bytecode is een voor mensen leesbaar formaat, daarom kan de machine het niet lezen zoals het is en moet het worden geconverteerd naar een machineleesbaar formaat, waarbij de onderstaande componenten worden gebruikt voor de interpretatie.
De Execution Engine heeft drie belangrijke componenten, te weten Interpreter, JIT Compiler en een Garbage Collector.
1. Tolk
Eenvoudig, voert de bytecode uit in een sequentiële methode. Een oproep wordt gedaan via een opdrachtregelquery met een gecompileerd bestand als argument. De interpreter interpreteert en voert opdrachten een voor een vrij snel uit, wat sneller gebeurt dan de JIT-compiler om de code te compileren.
Java-klassenaam
Een hoofdklasse () is verplicht in een gecompileerd .class-bestand.
2. JIT-compiler
Een van de belangrijkste componenten van de Java Runtime Environment, die de prestaties van de Java-applicatie tijdens runtime verbetert. Geen enkel ander component heeft meer invloed op de prestaties dan de JIT Compiler. Dit is een standaardcompiler en wordt geactiveerd wanneer een willekeurige Java-methode wordt aangeroepen.
3. Vuilnisman
Zoals de naam al doet vermoeden, heeft het iets met afval te maken, Garbage Collector zoekt eenvoudig naar elk mogelijk object dat beschikbaar is in de JVM-heapruimte, controleert of het in gebruik is en verwijdert vervolgens de ongebruikte objecten. Het markeert dus gewoon de stukjes geheugen die al dan niet in gebruik zijn. Daarna gaat het door met vegen, waarbij het eenvoudig het gemarkeerde object verwijdert. Het beste geval is dat er geen handmatig geheugentoewijzingssysteem nodig is, omdat de Garbage Collector automatisch ongebruikte geheugenruimte verwijdert. Maar omdat dit een automatische taak is, heeft geen enkele programmeur controle over het plannen van een tijdslot voor een specifieke opschoningstaak en heeft hij meer CPU-vermogen nodig bij het zoeken naar objectreferenties.
Conclusie
Hoewel het niet verplicht is om een duidelijk begrip te hebben van hoe JVM werkt, is het voor het schrijven van Java-code enorm nuttig. Voor een ontwikkelaar die de werking van JVM begrijpt, zal hij betere en geoptimaliseerde code schrijven, hoe lang of complex de vereiste ook is. Naast de hier gegeven beschrijving biedt JVM een breed scala aan functies en technologieën. Deze functies kunnen worden gebruikt om de prestaties te verbeteren die een specifieke leverancier nodig heeft
Aanbevolen artikelen
Dit is een handleiding voor Java Virtual Machine. Hier bespreken we de architectuur van de virtuele Java-machine, samen met de verschillende componenten. U kunt ook de volgende artikelen bekijken voor meer informatie -
- Bubble Sort in JavaScript
- Thread Life cycle in Java
- Wat is Java SE?
- Beste Java-compilers
- JRE vs JVM | Top 8 verschillen met (infographics)