Java Virtual Machine (JVM) е основен компонент на Java Runtime Environment (JRE), който позволява на Java програмите да работят на всяка платформа без модификация. JVM действа като интерпретатор между байт кода на Java и основния хардуер, осигуряващ известната възможност на Java Write Once Run Anywhere (WORA).
- Източник на Java (.java) -> компилиран от javac -> байт код (.class)
- JVM зарежда байт кода, проверява дали го свързва и след това го изпълнява
- Изпълнението може да включва интерпретиране на байт код или използване на Just-In-Time (JIT) компилация за преобразуване на горещ код в собствен машинен код за производителност
- Събирането на боклук работи във фонов режим, за да освободи памет от неизползвани обекти
Архитектура на JVM
Изображението по-долу демонстрира архитектурата и ключовите компоненти на JVM.
Компоненти на JVM архитектурата
Сега ще обсъдим подробно всеки компонент на JVM.
1. Подсистема за зареждане на класове
Отговаря основно за три дейности.
1. Зареждане
- Чете .class файлове и съхранява метаданни на класа в областта на метода.
- Създава обект Class в купчината, представляващ заредения клас.
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(); } }
Изход
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.
Забележка: За всеки зареден .клас само файл един обект на класа е създаден.
2. Свързване: Отговаря за подготовката на заредения клас за изпълнение. Тя включва три стъпки:
- Проверка: Гарантира, че байт кодът следва правилата на JVM и е безопасен за изпълнение.
- Приготвяне: Разпределя памет за статични променливи и присвоява стойности по подразбиране.
- Резолюция: Преобразува символни препратки в директни препратки в паметта.
3. Инициализация
- Присвоява действителни стойности на статичните променливи.
Типове зареждащи класове
- Зареждащ клас на Bootstrap: Зарежда основни Java класове (JAVA_HOME/lib).
- Зареждащ клас на разширение: Зарежда класове от директорията с разширения (JAVA_HOME/jre/lib/ext).
- Зареждащ клас система/приложение:
// 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()); } }
Изход
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
2. JVM области на паметта
- Област на метода: Съхранява информация на ниво клас като име на клас родителски клас методи променливи и статични данни. Споделя се в JVM.
- Heap площ: Съхранява всички обекти. Споделя се в JVM.
- Площ на стека: Всяка нишка има свой собствен стек за изпълнение; методът съхранява извиква локални променливи в рамките на стека. Унищожава се, когато нишката свърши.
- PC регистри: Съхранявайте адреса на текущо изпълняваната инструкция за всяка нишка.
- Нативни стекове на метода: Всяка нишка има отделен стек за изпълнение на естествен метод.
3. Двигател за изпълнение
Механизмът за изпълнение изпълнява .class (байт код). Той чете байт кода ред по ред, използва данни и информация, налични в различни области на паметта, и изпълнява инструкции. Тя може да бъде класифицирана в три части:
- Преводач: Той интерпретира байт кода ред по ред и след това се изпълнява. Недостатъкът тук е, че когато един метод се извиква многократно, всеки път се изисква интерпретация.
- Компилатор точно навреме (JIT): Използва се за повишаване на ефективността на преводач. Той компилира целия байткод и го променя в собствен код, така че всеки път, когато интерпретаторът види повтарящи се извиквания на метод, JIT предоставя директен естествен код за тази част, така че не е необходима повторна интерпретация, като по този начин ефективността се подобрява.
- Събирач на боклук: Унищожава нереферирани обекти. За повече информация относно Garbage Collector вижте Събирач на боклук .
4. Java Native Interface (JNI)
Това е интерфейс, който взаимодейства с Native Method Libraries и предоставя собствените библиотеки (C C++), необходими за изпълнението. Той позволява на JVM да извиква C/C++ библиотеки и да бъде извикван от C/C++ библиотеки, които може да са специфични за хардуера.
5. Библиотеки за собствени методи
Това са колекции от собствени библиотеки, необходими за изпълнение на собствени методи. Те включват библиотеки, написани на езици като C и C++.