Ce este JVM? Explicați JVM Architectură

⚡ Rezumat inteligent

Java Mașina virtuală (JVM) este motorul care oferă un mediu de execuție pentru a conduce Java cod, convertind bytecode-ul independent de platformă în limbaj mașină nativ. Acesta face parte din Java Mediul de execuție și activează JavaPortabilitatea de tip „scriere o singură dată și rulare oriunde”.

  • 🧩 Podul Bytecode: Java Compilatorul produce bytecode în loc de cod mașină, iar JVM interpretează acel bytecode pe orice sistem gazdă.
  • 🏗️ Nucleu Architectura: JVM combină un ClassLoader, o zonă de metode, un heap, stive, registre PC și un motor de execuție pentru a rula programe.
  • 🔄 Flux de compilare: Spre deosebire de C, Java nu necesită linking; fișierele de clasă sunt încărcate în RAM, verificate și apoi executate la momentul execuției.
  • Compilator JIT: Compilatorul Just-In-Time convertește bytecode-ul în cod mașină nativ în timpul execuției pentru a îmbunătăți performanța.
  • 🐢 Notă de performanță: Legătura dinamică și interpretarea în timpul execuției fac din punct de vedere istoric Java mai lent, deși versiunile moderne elimină în mare măsură acest decalaj.

FMV Architectură

În ce este JVM Java?

Java Mașină virtuală (JVM) este un motor care oferă un mediu de rulare pentru a conduce Java cod sau aplicații. Convertește Java bytecode în limbajul mașinii. JVM face parte din Java Mediul de execuție (JRE). În alte limbaje de programare, compilatorul produce cod mașină pentru un anumit sistem. Cu toate acestea, Java compilatorul produce cod pentru o mașină virtuală cunoscută sub numele de Java Mașină virtuală.

Cum funcționează JVM?

În primul rând, Java Codul este compilat în bytecode. Acest bytecode este interpretat pe diferite mașini. Între sistemul gazdă și Java sursă, bytecode-ul este un limbaj intermediar. JVM în Java este responsabil pentru alocarea spațiului de memorie.

Lucrarea de Java JVM Mașină virtuală

Lucrarea de Java Mașină virtuală (JVM)

Architectura JVM (Java mașină virtuală)

Acum, să înțelegem arhitectura JVM. Arhitectura JVM în Java conține un încărcător de clase, o zonă de memorie, un motor de execuție și multe altele.

FMV Architectură

Java Mașină virtuală Architectură

1) ClassLoader
Încărcătorul de clase este un subsistem folosit pentru încărcarea fișierelor de clasă. Acesta îndeplinește trei funcții principale, și anume încărcarea, conectarea și inițializarea.

2) Zona Metodă
Zona de metode JVM stochează structuri de clase precum metadatele, pool-ul de constante de execuție și codul pentru metode.

3) grămada
Toate Obiecte, variabilele lor de instanță aferente și matricele sunt stocate în heap. Această memorie este comună și partajată în mai multe fire.

4) Stive de limbaje JVM
Java Stivele de limbaj stochează variabile locale și rezultatele lor parțiale. Fiecare fir de execuție are propria stivă JVM, creată simultan cu crearea firului de execuție. Un nou cadru este creat de fiecare dată când este invocată o metodă și este șters când procesul de invocare a metodei este complet.

5) Registre PC
Registrul PC-ului stochează adresa Java instrucțiunea mașinii virtuale care se execută în prezent. În Java, fiecare fir de execuție are propriul registru PC separat.

6) Stive de metode native
Stivele de metode native conțin instrucțiunile codului nativ care depind de biblioteca nativă. Acesta este scris într-un alt limbaj în loc de Java.

7) Motor de execuție
Motorul de execuție citește bytecode-ul și îl execută bucată cu bucată. Folosește un interpretor și un compilator Just-In-Time (JIT) pentru a converti bytecode-ul în cod mașină nativ și a-l rula.

8) Interfața metodei native
Interfața Native Method este un cadru de programare. Permite Java codul care rulează într-o JVM pentru a apela și a fi apelat de aplicații și biblioteci native.

9) Biblioteci cu metode native
Bibliotecile native sunt o colecție de biblioteci native (C, C++) care sunt necesare pentru Execution Engine.

Software Code Procesul de compilare și execuție

Pentru a scrie și executa un program software, aveți nevoie de următoarele:

  • 1) Editor – Pentru a tasta programul; se poate folosi un blocnotes pentru asta.
  • 2) compilator – Pentru a converti programul dumneavoastră în limbaj de nivel înalt în cod mașină nativ.
  • 3) Linker – Pentru a combina diferitele referințe la fișiere de program din programul principal.
  • 4) Încărcător – Pentru a încărca fișierele de pe dispozitivul de stocare secundar, cum ar fi un hard disk, o unitate flash sau un CD, în memoria RAM pentru execuție. Încărcarea se face automat atunci când executați codul.
  • 5) Executarea – Execuția propriu-zisă a codului, care este gestionată de sistemul de operare și de procesor.

Având în vedere acest context, consultați următorul videoclip și aflați cum funcționează JVM-ul intern și cum este arhitectura acestuia (Java mașină virtuală).

Clic aici dacă videoclipul nu este accesibil

Procesul de compilare și execuție a codului C

Pentru a înțelege Java procesul de compilare, să aruncăm mai întâi o privire rapidă asupra procesului de compilare și creare de legături în C.

Să presupunem că în funcția principală ați apelat două funcții, f1 și f2. Funcția principală este stocată în fișierul a1.c.

Funcția principală a1.c din codul C

Funcția f1 este stocată într-un fișier a2.c.

Funcția f1 a2.c din codul C

Funcția f2 este stocată într-un fișier a3.c.

Funcția f2 a3.c din codul C

Toate aceste fișiere, adică a1.c, a2.c și a3.c, sunt transmise compilatorului, a cărui ieșire este fișierele obiect corespunzătoare, care reprezintă codul mașină.

Compilatorul de cod C produce fișiere obiect

Următorul pas este integrarea tuturor acestor fișiere obiect într-un singur fișier .exe cu ajutorul unui linker. Linkerul va reuni toate aceste fișiere și va produce fișierul .exe.

Linkerul de cod C produce fișier exe

În timpul rulării programului, un program de încărcare va încărca un fișier .exe în RAM pentru executare.

Încărcătorul de cod C încarcă fișierul exe în RAM

Java compilarea și executarea codului în Java VM

Acum, să ne uităm la procesul pentru JavaÎn comanda ta principală, ai două metode, f1 și f2.

  • Metoda principală este stocată în fișierul a1.java
  • f1 este stocat într-un fișier ca a2.java
  • f2 este stocat într-un fișier ca a3.java

Java Codul compilează trei fișiere în fișiere de clasă

Compilatorul va compila cele trei fișiere și va produce trei fișiere .class corespunzătoare, care constau din cod BYTE. Spre deosebire de C, nu se face nicio legătură.

Java VM, aur Java Mașină virtuală, se află în memoria RAM. În timpul execuției, folosind încărcătorul de clase, fișierele clasei sunt aduse în memoria RAM. Codul BYTE este verificat pentru orice breșe de securitate.

Java încărcătorul de clase aduce fișierele de clasă în RAM

Apoi, motorul de execuție va converti bytecode-ul în cod mașină nativ. Aceasta este compilare just-in-time. Acesta este unul dintre principalele motive pentru care Java este relativ lent.

Java motorul de execuție convertește bytecode-ul în cod nativ

NOTĂ: JIT, sau compilatorul Just-in-time, este o parte a Java Mașină virtuală (JVM). Interpretează părți ale codului octet care au funcționalități similare în același timp.

De ce este Java atât limbaj interpretat, cât și limbaj compilat?

Limbaje de programare sunt clasificate ca:

  • Limbaj de nivel superior, de exemplu, C++, Java
  • Limbaje de nivel mediu, de exemplu, C
  • Limbaj de nivel scăzut, de exemplu, Assembly
  • În cele din urmă, cel mai scăzut nivel ca Limbaj Mașină

A compilator este un program care convertește un program de la un nivel de limbaj la altul. De exemplu, conversia unui C++ programul în codul mașinii. The Java compilatorul convertește la nivel înalt Java cod în bytecode (care este, de asemenea, un tip de cod de mașină).

An interpret este un program care convertește un program la un anumit nivel într-un alt limbaj de programare la acelasi nivelDe exemplu, conversia unui Java program în C++.

In Java, generatorul de cod Just-In-Time convertește bytecode-ul în cod mașină nativ, care se află la aceleași niveluri de programare. Prin urmare, Java este atât un limbaj compilat, cât și unul interpretat.

De ce este Java încet?

Cele două motive principale din spatele încetinirii Java sunt:

  1. Legătura dinamică: Spre deosebire de C, legătura se face în timpul execuției, de fiecare dată când programul este rulat Java.
  2. Interpret de rulare: Conversia codului de octeți în cod de mașină nativ se face în timpul execuției în Java, ceea ce încetinește și mai mult viteza.

Totuși, cele mai recente versiuni ale Java au abordat în mare măsură aceste blocaje de performanță.

Întrebări frecvente

JVM rulează framework-uri de inteligență artificială și big data precum Deeplearning4j, Weka și Apache SparkCompilatorul Just-In-Time și gestionarea memoriei permit acestor biblioteci să proceseze eficient seturi mari de date pe diferite platforme, fără a rescrie codul nativ.

Da. Profilerii asistați de inteligență artificială pot analiza jurnalele de colectare a gunoiului, pot sugera dimensiuni ale heap-urilor și pot semnala metodele lente. Acestea ajută la reglarea semnalizatoarelor JVM și la identificarea mai rapidă a blocajelor, deși un dezvoltator ar trebui să valideze în continuare fiecare modificare recomandată.

JVM rulează cod bytecode. JRE include JVM-ul în pachet bibliotecile de bază necesare pentru rulare. Java programe. JDK-ul adaugă instrumente de dezvoltare precum compilatorul și depanatorul, așa că este folosit pentru a construi aplicații.

Bytecode-ul este independent de platformă, dar JVM-ul în sine este dependent de platformă. Fiecare sistem de operare are nevoie de propria implementare JVM. Acest design permite ca același bytecode compilat să ruleze oriunde este instalată o JVM compatibilă.

Rezumați această postare cu: