Какво е JVM? Обяснете JVM Archiтекстура

⚡ Умно обобщение

Java Виртуалната машина (JVM) е двигателят, който осигурява среда за изпълнение за управление Java код, преобразувайки платформено-независимия байткод в машинен език. Той е част от Java Runtime Environment и позволява Javaпреносимост за еднократно записване и изпълнение навсякъде.

  • 🧩 Байткод мост: - Java Компилаторът генерира байткод вместо машинен код, а JVM интерпретира този байткод на всяка хост система.
  • 🏗️ Ядро Archiтекстура: JVM комбинира ClassLoader, област за методи, heap, стекове, PC регистри и механизъм за изпълнение, за да изпълнява програми.
  • 🔄 Процес на компилация: За разлика от C, Java не изисква свързване; файловете с класове се зареждат в RAM паметта, проверяват се и след това се изпълняват по време на изпълнение.
  • JIT компилатор: Компилаторът Just-In-Time преобразува байткода в машинен код по време на изпълнение, за да подобри производителността.
  • ???? Бележка за ефективността: Динамичното свързване и интерпретацията по време на изпълнение исторически правят Java по-бавен, въпреки че съвременните версии до голяма степен запълват тази празнина.

JVM Archiтекстура

В какво е JVM Java?

Java Виртуална машина (JVM) е двигател, който осигурява среда за изпълнение за управление на Java код или приложения. Той преобразува Java байт код в машинен език. JVM е част от Java Runtime Environment (JRE). В други езици за програмиране компилаторът създава машинен код за определена система. Въпреки това, Java компилаторът създава код за виртуална машина, известна като Java Виртуална машина.

Как работи JVM?

Първо, Java кодът се компилира в байткод. Този байткод се интерпретира на различни машини. Между хост системата и Java източник, байткодът е междинен език. JVM в Java е отговорен за разпределянето на паметта.

Работа на Java JVM на виртуална машина

Работа на Java Виртуална машина (JVM)

Archiструктура на JVM (Java виртуална машина)

Сега, нека разберем архитектурата на JVM. JVM архитектура в Java съдържа зареждащ механизъм за класове, област с памет, механизъм за изпълнение и други.

JVM Archiтекстура

Java Виртуална машина Archiтекстура

1) ClassLoader
Зареждащата програма за класове е подсистема, използвана за зареждане на файлове с класове. Тя изпълнява три основни функции, а именно зареждане, свързване и инициализация.

2) Област на метода
JVM Method Area съхранява структури на класове, като метаданни, пула за изпълнение на константи и кода за методи.

3) Купчина
Всички Заведения, техните свързани променливи на екземпляри и масиви се съхраняват в купчината. Тази памет е обща и се споделя между множество нишки.

4) JVM езикови стекове
Java Езиковите стекове съхраняват локални променливи и техните частични резултати. Всяка нишка има свой собствен JVM стек, създаван едновременно със създаването на нишката. Нов кадър се създава всеки път, когато се извика метод, и се изтрива, когато процесът на извикване на метода е завършен.

5) PC регистри
Регистърът на компютъра съхранява адреса на Java инструкция за виртуална машина, която се изпълнява в момента. В Java, всяка нишка има свой собствен отделен PC регистър.

6) Нативни стекове от методи
Стековете от нативни методи съдържат инструкциите на нативния код, които зависят от нативната библиотека. Той е написан на друг език, вместо на Java.

7) Двигател за изпълнение
Изпълнителният механизъм чете байткода и го изпълнява част по част. Той използва интерпретатор и JIT (Just-In-Time) компилатор, за да преобразува байткода в машинен код и да го изпълни.

8) Интерфейс на собствения метод
Интерфейсът на Native Method е програмна рамка. Позволява Java код, изпълняван в JVM, за да извиква и да бъде извикан от нативни приложения и библиотеки.

9) Библиотеки за собствени методи
Native Libraries е колекция от native библиотеки (C, C++), които са необходими на Изпълнителната машина.

Софтуер Code Процес на компилация и изпълнение

За да напишете и изпълните софтуерна програма, ви е необходимо следното:

  • 1) Редактор – За да въведете програмата си; за това може да се използва бележник.
  • 2) съставител – Да конвертирате вашата програма, написана на език от високо ниво, в машинен код.
  • 3) Линкер – За да комбинирате различните препратки към програмни файлове в основната си програма.
  • 4) Товарач – За да заредите файловете от вашето вторично устройство за съхранение, като твърд диск, флаш устройство или CD, в RAM паметта за изпълнение. Зареждането се извършва автоматично, когато изпълните кода си.
  • 5) Изпълнение – Действително изпълнение на кода, което се обработва от вашата операционна система и процесор.

С оглед на това, вижте следното видео и научете вътрешната работа на JVM и архитектурата на JVM (Java Виртуална машина).

Кликнете тук ако видеото не е достъпно

Процес на компилиране и изпълнение на C код

За да разберем Java процес на компилиране, нека първо да разгледаме накратко процеса на компилиране и свързване в C.

Да предположим, че във функцията main сте извикали две функции, f1 и f2. Функцията main се съхранява във файла a1.c.

Главна функция a1.c в C код

Функцията f1 се съхранява във файл a2.c.

Функция f1 a2.c в C код

Функцията f2 се съхранява във файл a3.c.

Функция f2 a3.c в C код

Всички тези файлове, т.е. a1.c, a2.c и a3.c, се подават към компилатора, чийто изход са съответните обектни файлове, които представляват машинния код.

Компилаторът на C код създава обектни файлове

Следващата стъпка е интегрирането на всички тези обектни файлове в един .exe файл с помощта на линкер. Линкерът ще обедини всички тези файлове и ще създаде .exe файла.

C код линкер създава exe файл

По време на изпълнението на програмата, програма за зареждане ще зареди exe файла в RAM за изпълнение.

C код зарежда exe в RAM паметта

Java компилиране и изпълнение на код в Java VM

Сега, нека разгледаме процеса за JavaВ основния си случай имате два метода, f1 и f2.

  • Основният метод се съхранява във файла a1.java
  • f1 се съхранява във файл като a2.java
  • f2 се съхранява във файл като a3.java

Java кодът компилира три файла в клас файлове

Компилаторът ще компилира трите файла и ще създаде три съответстващи .class файла, които се състоят от BYTE код. За разлика от C, не се извършва свързване.

- Java VM, злато Java Виртуална машина, разположена в RAM паметта. По време на изпълнение, с помощта на зареждащия механизъм за класове, файловете на класовете се прехвърлят в RAM паметта. BYTE кодът се проверява за евентуални нарушения на сигурността.

Java зареждащият механизъм за класове пренася файловете на класовете в RAM паметта

След това, изпълнителният механизъм ще преобразува байткода в машинен код. Това е компилиране „навреме“. Това е една от основните причини, поради които Java е сравнително бавен.

Java изпълнителният механизъм преобразува байткода в нативен код

ЗАБЕЛЕЖКА: JIT, или компилаторът „Just-in-time“, е част от Java Виртуална машина (JVM). Тя интерпретира части от байт кода, които имат подобна функционалност едновременно.

Защо е Java както интерпретиран, така и компилиран език?

Програмни езици са класифицирани като:

  • Език от по-високо ниво, напр. C++, Java
  • Езици на средно ниво, например C
  • Ниско ниво на език, напр. Assembly
  • Накрая, най-ниското ниво като машинния език

A компилатор е програма, която преобразува програма от едно ниво на езика на друго. Например, преобразуването на C++ програма в машинен код. Java компилаторът преобразува високо ниво Java код в байткод (който също е вид машинен код).

An преводач е програма, която преобразува програма на едно ниво в друг език за програмиране на същото нивоНапример, преобразуването на Java програма в C++.

In Java, генераторът на код „Just-In-Time“ преобразува байткода в оригиналния машинен код, които са на едни и същи нива на програмиране. Следователно, Java е едновременно компилиран, така и интерпретиран език.

Защо е Java бавен?

Двете основни причини за бавността на Java са:

  1. Динамично свързване: За разлика от C, свързването се извършва по време на изпълнение, всеки път, когато програмата се стартира Java.
  2. Интерпретатор по време на изпълнение: Преобразуването на байт код в собствен машинен код се извършва по време на изпълнение в Java, което допълнително забавя скоростта.

Въпреки това, най-новите версии на Java са се справили до голяма степен с тези пречки в производителността.

Въпроси и Отговори

JVM управлява AI и рамки за големи данни, като Deeplearning4j, Weka и Apache. SparkНеговият компилатор „Just-In-Time“ и управление на паметта позволяват на тези библиотеки да обработват големи набори от данни ефективно на различни платформи, без да е необходимо да се пренаписва оригинален код.

Да. Профилиращите програми, подпомагани от изкуствен интелект, могат да анализират лог файлове за събиране на боклук, да предлагат размери на heap и да маркират бавни методи. Те помагат за настройване на JVM флаговете и по-бързо откриване на пречки, въпреки че разработчикът все пак трябва да валидира всяка препоръчителна промяна.

JVM изпълнява байткод. JRE пакетира JVM с основните библиотеки, необходими за изпълнението му. Java програми. JDK добавя инструменти за разработка, като компилатор и дебъгер, така че се използва за изграждане на приложения.

Байткодът е платформено независим, но самата JVM е платформено зависима. Всяка операционна система се нуждае от собствена JVM имплементация. Този дизайн позволява на един и същ компилиран байткод да работи навсякъде, където е инсталирана съвместима JVM.

Обобщете тази публикация с: