Wat is de JVM? Introductie van de Java Virtual Machine

De Java Virtual Machine is een programma dat tot doel heeft andere programma's uit te voeren. Het is een eenvoudig idee dat ook geldt als een van onze grootste voorbeelden van het coderen van kungfu . De JVM verstoorde de huidige status-quo en blijft vandaag programmeerinnovatie ondersteunen.

Waar wordt de JVM voor gebruikt

De JVM heeft twee primaire functies: Java-programma's laten draaien op elk apparaat of besturingssysteem (bekend als het "Write once, run anywhere" -principe), en het programmageheugen beheren en optimaliseren. Toen Java in 1995 werd uitgebracht, werden alle computerprogramma's naar een specifiek besturingssysteem geschreven en werd het programmageheugen beheerd door de softwareontwikkelaar. Dus de JVM was een openbaring.

JavaWorld /

Het hebben van een technische definitie voor de JVM is handig, en er is ook een alledaagse manier waarop softwareontwikkelaars erover denken. Laten we die opsplitsen:

  • Technische definitie : De JVM is de specificatie voor een softwareprogramma dat code uitvoert en de runtime-omgeving voor die code biedt.
  • Alledaagse definitie : de JVM is hoe we onze Java-programma's uitvoeren. We configureren de instellingen van de JVM en vertrouwen erop om programmabronnen tijdens de uitvoering te beheren.

Wanneer ontwikkelaars praten over de JVM, bedoelen we meestal het proces dat wordt uitgevoerd op een machine, vooral een server, die het resourcegebruik voor een Java-app vertegenwoordigt en beheert. Vergelijk dit met de JVM-specificatie , die de vereisten beschrijft voor het bouwen van een programma dat deze taken uitvoert.

Wie ontwikkelt en onderhoudt de JVM?

De JVM wordt veel gebruikt, intensief gebruikt en onderhouden door een aantal zeer slimme programmeurs, zowel zakelijk als open source. Het OpenJDK-project is het resultaat van de beslissing van Sun Microsystems om open-source Java te gebruiken. OpenJDK is doorgegaan met Oracle's rentmeesterschap van Java, met veel van het zware werk tegenwoordig gedaan door Oracle-ingenieurs.

Geheugenbeheer in de JVM

De meest voorkomende interactie met een actieve JVM is om het geheugengebruik in de heap en stack te controleren. De meest gebruikelijke aanpassing is het afstemmen van de geheugeninstellingen van de JVM.

Afvalinzameling

Vóór Java werd al het programmageheugen beheerd door de programmeur. In Java wordt het programmageheugen beheerd door de JVM. De JVM beheert het geheugen via een proces genaamd garbage collection , dat continu ongebruikt geheugen in Java-programma's identificeert en elimineert. Garbage collection vindt plaats in een actieve JVM.

In het begin kreeg Java veel kritiek omdat het niet zo "close to the metal" was als C ++, en daarom niet zo snel. Vooral het afvalinzamelingsproces was controversieel. Sindsdien zijn er verschillende algoritmen en benaderingen voorgesteld en gebruikt voor garbage collection. Met consistente ontwikkeling en optimalisatie is de garbagecollection enorm verbeterd.

Wat betekent 'dicht bij het metaal'?

Als programmeurs zeggen dat een programmeertaal of -platform 'dicht bij het metaal' staat, bedoelen we dat de ontwikkelaar in staat is om programmatisch (door code te schrijven) het geheugen van een besturingssysteem te beheren. In theorie kunnen programmeurs meer prestaties uit onze programma's halen door te bepalen hoeveel er wordt gebruikt en wanneer ze deze moeten weggooien. In de meeste gevallen levert het delegeren van geheugenbeheer aan een zeer verfijnd proces zoals de JVM betere prestaties en minder fouten op dan wanneer u het zelf doet.

De JVM in drie delen

Je zou kunnen zeggen dat er drie aspecten zijn aan de JVM: specificatie, implementatie en instantie. Laten we elk van deze bekijken.

1. De JVM-specificatie

Ten eerste is de JVM een softwarespecificatie. Op een enigszins circulaire manier benadrukt de JVM-specificatie dat de implementatiedetails niet binnen de specificatie zijn gedefinieerd, om maximale creativiteit mogelijk te maken bij de realisatie ervan:

"Om de virtuele Java-machine correct te implementeren, hoeft u alleen het classbestandsformaat te kunnen lezen en de daarin gespecificeerde bewerkingen correct uit te voeren."

JS Bach beschreef ooit het maken van muziek op dezelfde manier:

'Het enige dat u hoeft te doen, is de juiste toets op het juiste moment aan te raken.'

Het enige dat de JVM hoeft te doen, is Java-programma's correct uitvoeren. Klinkt eenvoudig, ziet er van buiten zelfs eenvoudig uit, maar het is een enorme onderneming, vooral gezien de kracht en flexibiliteit van de Java-taal.

De JVM als een virtuele machine

De JVM is een virtuele machine die Java-klassebestanden op een draagbare manier uitvoert. Omdat het een virtuele machine is, is de JVM een abstractie van een onderliggende, daadwerkelijke machine, zoals de server waarop uw programma draait. Ongeacht welk besturingssysteem of welke hardware er daadwerkelijk aanwezig is, de JVM creëert een voorspelbare omgeving waarin programma's kunnen worden uitgevoerd. In tegenstelling tot een echte virtuele machine creëert de JVM echter geen virtueel besturingssysteem. Het zou nauwkeuriger zijn om de JVM te beschrijven als een beheerde runtime-omgeving of een virtuele procesmachine .

2. JVM-implementaties

Het implementeren van de JVM-specificatie resulteert in een daadwerkelijk softwareprogramma, dat een JVM-implementatie is. In feite zijn er veel JVM-implementaties, zowel open source als propriëtair. OpenJDK's HotSpot JVM is de referentie-implementatie en blijft een van de meest grondig beproefde codebases ter wereld. HotSpot is ook de meest gebruikte JVM.

Bijna alle gelicentieerde JVM's zijn gemaakt als splitsingen van de OpenJDK en de HotSpot JVM, inclusief Oracle's gelicentieerde JDK. Ontwikkelaars die een gelicentieerde vork van de OpenJDK maken, worden vaak gemotiveerd door de wens om besturingssysteemspecifieke prestatieverbeteringen toe te voegen. Meestal downloadt en installeert u de JVM als een gebundeld onderdeel van een Java Runtime Environment (JRE).

3. Een JVM-exemplaar

Nadat de JVM-specificatie is geïmplementeerd en vrijgegeven als een softwareproduct, kunt u deze downloaden en uitvoeren als een programma. Dat gedownloade programma is een instantie (of geïnstantieerde versie) van de JVM.

Als ontwikkelaars het meestal over "de JVM" hebben, bedoelen we een JVM-instantie die in een softwareontwikkelings- of productieomgeving wordt uitgevoerd. Je zou kunnen zeggen: "Hé Anand, hoeveel geheugen gebruikt de JVM op die server?" of: "Ik kan niet geloven dat ik een circulaire oproep heb gemaakt en een stack overflow-fout heeft mijn JVM gecrasht. Wat een nieuwe fout!"

Wat is een softwarespecificatie?

Een softwarespecificatie (of specificatie) is een door mensen leesbaar ontwerpdocument dat beschrijft hoe een softwaresysteem zou moeten werken. Het doel van een specificatie is om een ​​duidelijke beschrijving en vereisten te creëren waaraan ingenieurs kunnen coderen.

Klassebestanden laden en uitvoeren in de JVM

We hebben het gehad over de rol van de JVM bij het uitvoeren van Java-applicaties, maar hoe vervult het zijn functie? Om Java-applicaties uit te voeren, is de JVM afhankelijk van de Java-class loader en een Java-uitvoeringsengine.

De Java-class loader in de JVM

Alles in Java is een klasse en alle Java-toepassingen zijn opgebouwd uit klassen. Een aanvraag kan bestaan ​​uit één klas of duizenden. Om een ​​Java-applicatie uit te voeren, moet een JVM gecompileerde .class-bestanden in een context laden, zoals een server, waar ze toegankelijk zijn. Een JVM is afhankelijk van zijn klasse-loader om deze functie uit te voeren.

De Java-klassenlader is het deel van de JVM dat klassen in het geheugen laadt en ze beschikbaar maakt voor uitvoering. Class loaders gebruiken technieken zoals lazy-loading en caching om het laden van klassen zo efficiënt mogelijk te maken. Dat gezegd hebbende, het laden van klassen is niet de epische hersenkraker die (zeg maar) draagbaar runtime-geheugenbeheer is, dus de technieken zijn relatief eenvoudig.

Elke Java Virtual Machine bevat een klassenlader. De JVM-specificatie beschrijft standaardmethoden voor het opvragen en manipuleren van de klassenlader tijdens runtime, maar JVM-implementaties zijn verantwoordelijk voor het vervullen van deze mogelijkheden. Vanuit het perspectief van de ontwikkelaar zijn de onderliggende mechanismen voor het laden van klassen meestal een zwarte doos.

De executie-engine in de JVM

Zodra de klassenlader klaar is met het laden van klassen, begint de JVM de code in elke klasse uit te voeren. De uitvoeringsengine is de JVM-component die deze functie afhandelt. De executie-engine is essentieel voor de draaiende JVM. In feite is het voor alle praktische doeleinden de JVM-instantie.

Bij het uitvoeren van code moet de toegang tot systeembronnen worden beheerd. De JVM-uitvoeringsengine staat tussen het actieve programma - met zijn eisen voor bestands-, netwerk- en geheugenbronnen - en het besturingssysteem, dat deze bronnen levert.

Hoe de uitvoeringsengine systeembronnen beheert

Systeembronnen kunnen worden onderverdeeld in twee brede categorieën: geheugen en al het andere.

Bedenk dat de JVM verantwoordelijk is voor het weggooien van ongebruikt geheugen, en dat garbage collection het mechanisme is dat die verwijdering doet. De JVM is ook verantwoordelijk voor het toewijzen en onderhouden van de referentiestructuur die de ontwikkelaar als vanzelfsprekend beschouwt. De uitvoeringsengine van de JVM is bijvoorbeeld verantwoordelijk voor het nemen van zoiets als het newtrefwoord in Java en het omzetten in een OS-specifiek verzoek voor geheugentoewijzing.

Naast het geheugen beheert de uitvoeringsengine bronnen voor toegang tot het bestandssysteem en netwerk-I / O. Aangezien de JVM interoperabel is tussen besturingssystemen, is dit geen sinecure. Naast de resourcebehoeften van elke toepassing, moet de uitvoeringsengine reageren op elke besturingssysteemomgeving. Dat is hoe de JVM kan omgaan met in-the-wild-eisen.

JVM-evolutie: verleden, heden, toekomst

In 1995 introduceerde de JVM twee revolutionaire concepten die sindsdien het standaardtarief voor moderne softwareontwikkeling zijn geworden: "Eén keer schrijven, overal uitvoeren" en automatisch geheugenbeheer. Software-interoperabiliteit was in die tijd een gewaagd concept, maar tegenwoordig zouden maar weinig ontwikkelaars er twee keer over nadenken. Evenzo, terwijl onze technische voorouders het programmageheugen zelf moesten beheren, groeide mijn generatie op met garbage collection.

We zouden kunnen zeggen dat James Gosling en Brendan Eich de moderne programmering hebben uitgevonden, maar duizenden anderen hebben in de daaropvolgende decennia hun ideeën verfijnd en voortgebouwd. Waar de Java Virtual Machine oorspronkelijk alleen voor Java was, is deze tegenwoordig geëvolueerd om vele script- en programmeertalen te ondersteunen, waaronder Scala, Groovy en Kotlin. Vooruitkijkend is het moeilijk om een ​​toekomst te zien waarin de JVM geen prominent onderdeel is van het ontwikkelingslandschap.

Alles over de JVM

  • Java-uitdagers: threadgedrag in de JVM
  • Java-uitdagers: overbelasting van methoden in de JVM
  • Binnen JVM prestatie-optimalisatie
  • Basisprincipes van bytecode: hoe de JVM met bytecode omgaat
  • Java-uitzonderingen: hoe de JVM omgaat met uitzonderingen
  • Introductie van de lean, gemene Java virtuele machine

Dit verhaal, "Wat is de JVM? Introductie van de Java Virtual Machine" is oorspronkelijk gepubliceerd door JavaWorld.