Java virtuālā mašīna (JVM) ir Java Runtime Environment (JRE) galvenā sastāvdaļa, kas ļauj Java programmām bez izmaiņām darboties jebkurā platformā. JVM darbojas kā tulks starp Java baitkodu un pamatā esošo aparatūru, nodrošinot Java slaveno Write Once Run Anywhere (WORA) iespēju.
- Java avots (.java) -> kompilējis javac -> baitkods (.class)
- JVM ielādē baitkodu, pārbauda, vai tas to saista, un pēc tam to izpilda
- Izpilde var ietvert baitkoda interpretāciju vai Just-In-Time (JIT) kompilācijas izmantošanu, lai karsto kodu pārveidotu vietējā mašīnkodā veiktspējai.
- Atkritumu savākšana darbojas fonā, lai atgūtu atmiņu no neizmantotajiem objektiem
JVM arhitektūra
Tālāk esošajā attēlā ir parādīta JVM arhitektūra un galvenie komponenti.
JVM arhitektūras sastāvdaļas
Tagad mēs detalizēti apspriedīsim katru JVM komponentu.
kas ir ziemas guļas režīms
1. Klases iekrāvēja apakšsistēma
Tā galvenokārt ir atbildīga par trim darbībām.
1. Iekraušana
- Lasa .class failus un saglabā klases metadatus metožu apgabalā.
- Izveido klases objektu kaudzē, kas pārstāv ielādēto klasi.
class GFG{ static{ System.out.println('GFG class is loaded by the JVM!'); } public void display(){ System.out.println('Method of GFG class is executed.'); } } public class Test{ public static void main(String[] args) throws Exception{ System.out.println('Main method started.'); // Loading the class explicitly using Class.forName() Class.forName('GFG'); System.out.println('Class loaded successfully.'); // Creating object to execute method GFG obj = new GFG(); obj.display(); } }
Izvade
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.
Piezīme: Par katru ielādēto .klase tikai fails viens tiek izveidots klases objekts.
2. Saistīšana: Atbildīgs par ielādētās klases sagatavošanu izpildei. Tas ietver trīs darbības:
- Verifikācija: Nodrošina, ka baitkods atbilst JVM noteikumiem un ir droši izpildāms.
- Sagatavošana: Piešķir atmiņu statiskajiem mainīgajiem un piešķir noklusējuma vērtības.
- Izšķirtspēja: Pārvērš simboliskās atsauces atmiņā tiešās atsaucēs.
3. Inicializācija
- Piešķir faktiskās vērtības statiskajiem mainīgajiem.
- Izpilda klasē definētos statiskos blokus.
Klases iekrāvēju veidi
- Bootstrap klases ielādētājs: Ielādē Java galvenās klases (JAVA_HOME/lib).
- Paplašinājuma klases ielādētājs: Ielādē klases no paplašinājumu direktorija (JAVA_HOME/jre/lib/ext).
- Sistēmas/lietojumprogrammu klases ielādētājs: Ielādē klases no lietojumprogrammas klases ceļa.
// Java code to demonstrate Class Loader subsystem public class Geeks { public static void main(String[] args) { // String class is loaded by bootstrap loader and // bootstrap loader is not Java object hence null System.out.println(String.class.getClassLoader()); // Test class is loaded by Application loader System.out.println(Geeks.class.getClassLoader()); } }
Izvade
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
2. JVM atmiņas apgabali
- Metodes apgabals: Saglabā klases līmeņa informāciju, piemēram, klases nosaukumu vecāku klases metožu mainīgos un statiskos datus. Koplietots visā JVM.
- Kaudzes apgabals: Uzglabā visus objektus. Koplietots visā JVM.
- Kaudzes apgabals: Katram pavedienam ir sava izpildlaika kaudze; saglabā metodes izsaukumus lokālos mainīgos steka kadros. Iznīcināts, kad pavediens beidzas.
- Datoru reģistri: Katram pavedienam turiet pašlaik izpildāmās instrukcijas adresi.
- Vietējo metožu kopas: Katram pavedienam ir atsevišķa kaudze vietējās metodes izpildei.
3. Izpildes dzinējs
Izpildprogramma izpilda .class (baitu kodu). Tas nolasa baitu kodu pēc rindas, izmanto datus un informāciju, kas atrodas dažādās atmiņas zonās, un izpilda instrukcijas. To var iedalīt trīs daļās:
- Tulks: Tas interpretē baitkoda rindiņu pa rindiņai un pēc tam izpilda. Trūkums ir tāds, ka viena metode tiek izsaukta vairākas reizes katru reizi, kad ir nepieciešama interpretācija.
- Just-In-Time kompilators (JIT): To izmanto, lai palielinātu tulka efektivitāti. Tas apkopo visu baitkodu un maina to uz vietējo kodu, tāpēc ikreiz, kad tulks redz atkārtotus metodes izsaukumus, JIT nodrošina tiešu vietējo kodu šai daļai, tāpēc atkārtota interpretācija nav nepieciešama, tādējādi uzlabojot efektivitāti.
- Atkritumu savācējs: Tas iznīcina objektus, kuriem nav atsauces. Plašāku informāciju par atkritumu savācēju skatiet Atkritumu savācējs .
4. Java Native Interface (JNI)
Tā ir saskarne, kas mijiedarbojas ar Native Method bibliotēkām un nodrošina izpildei nepieciešamās vietējās bibliotēkas (C C++). Tas ļauj JVM izsaukt C/C++ bibliotēkas un izsaukt C/C++ bibliotēkas, kas var būt specifiskas aparatūrai.
5. Native Method Libraries
Šīs ir vietējo bibliotēku kolekcijas, kas nepieciešamas vietējo metožu izpildei. Tajos ietilpst bibliotēkas, kas rakstītas tādās valodās kā C un C++.