Introducere în mașina virtuală Java
În acest articol, vom afla despre Mașina Virtuală Java, numită „JVM”. Java Virtual Machine este o Mașină Virtuală care permite unui sistem informatic să ruleze / să execute programe Java. Practic, JVM este un motor, care funcționează ca un mediu de rulare pentru codul Java. JVM convertește codul java în limbajul mașinii. Când executați un fișier .class compilat, acesta merge la JVM și apoi JVM returnează ieșirea. Java Virtual Machine este o parte a JRE, care înseamnă „Java Runtime Environment”. Sarcinile de bază pentru o mașină virtuală Java constă în încărcarea codului, apoi verificarea codului și executarea acestuia. De asemenea, furnizați mediul de rulare pentru executarea codului. JVM este format din diverse componente precum Classloader, Lista spațiului alocat de JVM precum Stack, un motor de execuție și câteva biblioteci native.
Arhitectura mașinii virtuale Java 
După cum se arată în imaginea de mai sus, Java Virtual Architecture Architecture este format din diverse componente. Haideți să aflăm despre fiecare componentă specifică individual.
Încărcător
După cum sugerează și numele, este o componentă responsabilă pentru încărcarea fișierelor de clasă. Funcțiile majore ale încărcătorului sunt încărcarea, conectarea și inițializarea unui fișier de clasă. Încărcătorul funcționează în timp de execuție.
- Încărcare: Practic, încărcătorul citește fișierul .class, apoi generează codul binar și îl salvează într-o zonă a metodei. Bootstrap Classloader, Extension Classloader și Application Classloader sunt diferitele ClassLoaders responsabile de încărcarea diferitelor clase.
- Linking: trei funcții majore precum Verificarea, Pregătirea și Rezolvarea. Începe cu verificarea fișierului .class. Dacă verificarea nu reușește, oferă o excepție de verificare a timpului de rulare. Mai târziu, Memoria este alocată variabilelor cu valori implicite. Apoi, în sfârșit, referințele de memorie simbolică sunt înlocuite cu referință directă din zona de memorie.
- Inițializare: Aceasta este o parte finală a ClassLoader. Valorile originale sunt alocate tuturor variabilelor statice, urmate de executarea blocului static. Această parte se execută de sus în partea de jos a unei clase.
Morman
Detalii despre un obiect și variabile de instanță sunt toate stocate aici. Este o zonă de memorie partajată, ceea ce înseamnă că datele stocate aici nu sunt sigure în fire.
Excepție în thread-ul „principal” java.lang.OutOfMemoryError: spațiu heap Java
Una dintre cele mai raportabile erori este excepția „ OutOfMemoryError ”, ceea ce înseamnă că JVM nu poate aloca un obiect în zona Heap sau alocarea memoriei nu se poate face pentru același obiect.
Grămadă
Aici se creează o stivă de rulare separată pentru fiecare fir nou. Cunoscută și sub denumirea de Stilă de executare, de fiecare dată când se apelează la o metodă, toate detaliile sunt stocate în standul de rulare corespunzător, iar după finalizarea metodei, aceste detalii sunt eliminate din stivă.
Registre PC
Pentru fiecare fir, este creat un registru PC separat (Contor de programe), care stochează adresa instrucțiunii de execuție curente, care, ulterior, va fi actualizată cu instrucțiunea următoare. Această zonă de memorie este destul de mică și are dimensiuni fixe.
Pila de metode native
Este unul dintre propriile sale zone de memorie, care este invocată de un thread și apoi thread-ul este într-un nivel cu totul nou, în care restricțiile de structură și securitate implicate de Java Virtual Machine nu mai sunt în exercițiu. În comparație cu alte zone de memorie runtime, memoria ocupată de metoda nativă stive nu are o dimensiune fixă, fără limitări în creștere sau decrementare.
Interfață nativă Java
JNI interacționează pur și simplu cu bibliotecile de metodă nativă menționate mai jos, care sunt de implementare C, C ++ și oferă același lucru motorului de execuție. Accesul direct la codul de asamblare este permis de JNI. Pentru un JVM, Java și Native sunt cele două tipuri de coduri. JNI stabilește fără probleme o legătură bine definită între aceste două.
Bibliotecile cu metode native
Colecția de biblioteci autohtone, conform cerințelor motorului de execuție.
Motor de executie
Ei bine, acum avem program java în bytecode, care este atribuit zonelor de date explicate mai sus prin intermediul unui încărcător de clase, iar acum bytecode va fi executat de către motorul de execuție. Execution Engine citește simplu bytecode în unități, cum ar fi o mașină care citeste linii de cod unul câte unul. Bytecode este un format care poate fi citit de om, motiv pentru care mașina nu poate citi, îl are și trebuie să fie convertit într-un format care poate fi citit de mașină, unde componentele de mai jos sunt utilizate în scopul interpretării.
Motorul de execuție are trei componente majore, care sunt interpretul, JIT Compiler și un colector de gunoi.
1. Interpret
Pur și simplu, execută bytecode într-o metodă secvențială. Un apel este făcut de o interogare din linia de comandă cu un fișier compilat ca argument. Interpretul este destul de rapid în interpretarea și executarea comenzilor unul câte unul, ceea ce se întâmplă mai repede decât compilatorul JIT pentru a compila codul.
numele clasei java
O clasă principală () se află într-un fișier .class compilat.
2. Compilator JIT
Una dintre cele mai importante componente ale Java Runtime Environment, care îmbunătățește performanța aplicației Java în timpul rulării. Nicio altă componentă nu are mai mult impact asupra performanței decât JIT Compiler. Acesta este un compilator implicit și este activat atunci când este apelată orice metodă Java.
3. Colector de gunoi
După cum sugerează și numele, are ceva de-a face cu gunoiul, Garbage Collector pur și simplu caută fiecare obiect posibil disponibil în spațiul JVM heap, verifică dacă este folosit și apoi șterge cele neutilizate. Deci, pur și simplu marchează bucățile de memorie utilizate sau nu. Apoi continuă să mătura, unde pur și simplu elimină obiectul marcat. Cel mai bun caz de utilizare este, nu este nevoie de un sistem manual de alocare a memoriei, deoarece Garbage Collector face sarcina de a elimina automat spațiul de memorie neutilizat. Dar, întrucât aceasta este o sarcină automată, niciun programator nu are control asupra programării oricărui slot pentru curățarea specifică a sarcinii și necesită mai multă putere a procesorului, deoarece caută referințe la obiect.
Concluzie
Deși nu este obligatoriu să înțelegem clar modul în care funcționează JVM, în scopul scrierii codului Java, este de mare ajutor. Pentru un dezvoltator care înțelege funcționarea JVM, va scrie un cod mai bun și optimizat, oricât de lung sau complex ar fi cerința. Pe lângă descrierea oferită aici, JVM oferă o gamă largă de caracteristici și tehnologii. Aceste caracteristici pot fi utilizate pentru a îmbunătăți performanța, după cum este necesar de un furnizor specific
Articole recomandate
Acesta este un ghid al Mașinii virtuale Java. Aici vom discuta despre arhitectura mașinii virtuale java împreună cu diversele sale componente. De asemenea, puteți consulta următoarele articole pentru a afla mai multe -
- Sortare cu bule în JavaScript
- Ciclul de viață filetat în Java
- Ce este Java SE?
- Cele mai bune compilatoare Java
- JRE vs JVM | Top 8 diferențe cu (Infografie)