Articles

JVM-architectuur en hoe werkt het?

Prabhu Rajendran

Follow

28 mrt, 2019 – 3 min read

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?

  1. Class Loader Subsystem
  2. Runtime Data Area
  3. 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.

  1. Bootstrap Class Loader – laadt de klasse uit het bootstrap-klassenpad (rt.jar -hoge prioriteit)
  2. Extension Class Loader – laadt de klasse die is opgenomen in (jre/lib).
  3. Application Class Loader – laadt de klasse op applicatieniveau.

1.2 Linking : Voert de Verification, Preparation en Resolution uit op de geladen Class.

  1. Verify : Bytecode verifier zal verifiëren of de gegenereerde bytecode correct is of niet, anders krijgen we Verification Error(java.lang.VerifyError)
  2. Prepare : Voor alle statische variabelen in de bytecode wordt geheugen toegewezen en worden standaardwaarden geladen.
  3. 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

  1. Methodegebied : hierin worden alle gegevens op klassenniveau opgeslagen (velden, methode, statische variabele). Slechts één methode gebied per JVM.
  2. 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.

  1. Lokale variabelen worden opgeslagen in het stackgeheugen
  2. Thread safe
  3. 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.

  1. Interpreter: Interpreteert de bytecode sneller, maar uitvoering langzaam.(een methode wordt aangeroepen meerdere malen het zal nieuwe Interpretation nodig is).
  2. 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)

Laat een antwoord achter

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *