JVM-architectuur en hoe werkt het?
Elke Java-ontwikkelaar weet dat JRE bytecode uitvoert , maar JRE is implementatie van JVM. “Die analyseert de bytecode, interpreteert de code en voert deze uit.
Virtual Machine is een software-implementatie van een fysieke machine. Java is ontwikkeld met het concept van WORA (Write Once Run Anywhere).De compiler compileert het Java-bestand in een klasse-bestand, waarna het klasse-bestand wordt ingevoerd in de JVM, die het laadt en uitvoert.
Hoe werkt de JVM?
- Class Loader Subsystem
- Runtime Data Area
- Execution Engine.
Nu, Laten we in elk deel springen.
1.Class Loader SubSystem :
Java Dynamic Class loading functionaliteit wordt afgehandeld door class loader subsystem. “Laad -> Link -> Initialiseer het klassebestand” voor de eerste keer tijdens runtime.
1.1. Laden : Klassen worden door deze component geladen.
- Bootstrap Class Loader – laadt de klasse uit het bootstrap-klassenpad (rt.jar -hoge prioriteit)
- Extension Class Loader – laadt de klasse die is opgenomen in (jre/lib).
- Application Class Loader – laadt de klasse op applicatieniveau.
1.2 Linking : Voert de Verification, Preparation en Resolution uit op de geladen Class.
- Verify : Bytecode verifier zal verifiëren of de gegenereerde bytecode correct is of niet, anders krijgen we Verification Error(java.lang.VerifyError)
- Prepare : Voor alle statische variabelen in de bytecode wordt geheugen toegewezen en worden standaardwaarden geladen.
- Resolve (Optioneel): Symbolische referenties van de klasse zullen worden vervangen door originele referenties van methodegebied.
1.3 Initialisatie : Laatste fase van class loader, hier worden aan alle statische variabelen de originele waarden toegekend & statisch blok wordt uitgevoerd.
2. Runtime Data Area : (JVM-geheugen) – verdeeld in 5 componenten
- Methodegebied : hierin worden alle gegevens op klassenniveau opgeslagen (velden, methode, statische variabele). Slechts één methode gebied per JVM.
- Heap Gebied : alle objecten & overeenkomstige instantie , variabele , array zal worden opgeslagen. Eén Heap per JVM
- waarbij Heap & Method Area niet thread safe is het gedeelde bron voor JVM
3. Stack Area : voor elke thread wordt een nieuwe stack aangemaakt tijdens runtime. Voor elke methode-oproep wordt een item toegevoegd aan de stack, stack frame genaamd.
- Lokale variabelen worden opgeslagen in het stackgeheugen
- Thread safe
- Stack Frame is onderverdeeld in drie subentiteiten:
3.1 Local Variable Array : gerelateerd aan lokale methode , variabelen worden gebruikt
3.2 Operand Stack : Intermediate Operation – fungeert als runtime werkruimte om bewerkingen uit te voeren
3.3 Frame Data : alle symbolen die corresponderen met de methode worden opgeslagen , in het geval van een uitzondering , catch block informatie wordt bijgehouden.
4. PC Registers: Elke Thread zal een register hebben dat de huidige uitvoerende operatie opslaat.(zodra elke instructie wordt bijgewerkt, zal het PC-register ook de volgende instructie bijwerken)
5. Native Methode Stack: Bevat native methode-informatie voor elke thread.
3. Execution Engine : Byte-code die is toegewezen in Runtime data area zal worden uitgevoerd.
- Interpreter: Interpreteert de bytecode sneller, maar uitvoering langzaam.(een methode wordt aangeroepen meerdere malen het zal nieuwe Interpretation nodig is).
- JIT Compiler : neutraliseren het nadeel van interpreter.whenever het vindt herhaalde code het gebruikt JIT Compiler.
Het compileert de bytecode in native code (Native code wordt direct gebruikt voor herhaalde methode-aanroepen).
Intermediate Code Generator : Genereert intermediaire code wanneer nodig
Code Optimizer: Optimaliseert de code
Target Code Generator : Converteert naar Machine / Native Code
Profiler: Helpt bij het vinden van de meervoudige methode-aanroepen (het vinden van hotspots)