Що таке JVM? Поясніть JVM Archiтектура
⚡ Розумний підсумок
Java Віртуальна машина (JVM) – це рушій, який забезпечує середовище виконання для керування Java код, перетворюючи платформо-незалежний байт-код на рідну машинну мову. Він є частиною Java Середовище виконання та дозволяє Javaпереносимість одноразового запису та запуску будь-де.

Що таке JVM Java?
Java Віртуальна машина (JVM) це двигун, який забезпечує середовище виконання для керування Java код або програми. Він перетворює Java байт-код на машинну мову. JVM є частиною Java Середовище виконання (JRE). В інших мовах програмування компілятор створює машинний код для певної системи. Однак Java компілятор створює код для віртуальної машини, відомої як Java Віртуальна машина.
Як працює JVM?
По-перше, Java код компілюється в байт-код. Цей байт-код інтерпретується на різних машинах. Між хост-системою та Java джерело, байт-код є проміжною мовою. JVM у Java відповідає за розподіл пам'яті.
Робота з Java Віртуальна машина (JVM)
Archiтектура JVM (Java віртуальна машина)
Тепер давайте розберемося з архітектурою JVM. Архітектура JVM в Java містить завантажувач класів, область пам'яті, механізм виконання та багато іншого.
Java Віртуальна машина Archiтектура
1) Завантажувач класів
Завантажувач класів — це підсистема, яка використовується для завантаження файлів класів. Вона виконує три основні функції: завантаження, компонування та ініціалізацію.
2) Область методу
Область методів JVM зберігає структури класів, такі як метадані, пул констант середовища виконання та код для методів.
3) Купа
Всі Об'єкти, пов’язані з ними змінні екземпляра та масиви зберігаються у купі. Ця пам'ять є загальною та спільною для кількох потоків.
4) Стеки мови JVM
Java Стеки мов зберігають локальні змінні та їх часткові результати. Кожен потік має свій власний стек JVM, який створюється одночасно зі створенням потоку. Новий фрейм створюється щоразу, коли викликається метод, і він видаляється після завершення процесу виклику методу.
5) Регістри ПК
Регістр ПК зберігає адресу Java інструкція віртуальної машини, яка виконується на даний момент. У Java, кожен потік має свій власний окремий регістр PC.
6) Стеки рідних методів
Стеки нативних методів містять інструкції нативного коду, які залежать від нативної бібліотеки. Він написаний іншою мовою, а не Java.
7) Механізм виконання
Механізм виконання зчитує байт-код і виконує його по частинах. Він використовує інтерпретатор і компілятор Just-In-Time (JIT) для перетворення байт-коду в машинний код та його запуску.
8) Інтерфейс рідного методу
Інтерфейс рідного методу — це структура програмування. Це дозволяє Java код, що виконується в JVM для виклику та отримання викликів від нативних програм та бібліотек.
9) Бібліотеки рідних методів
Native Libraries — це колекція нативних бібліотек (C, C++), які потрібні механізму виконання.
Софтвер Code Процес компіляції та виконання
Щоб написати та виконати програмне забезпечення, вам знадобиться наступне:
- 1) Редактор – Щоб ввести свою програму; для цього можна використовувати блокнот.
- 2) компілятор – Перетворити вашу програму на мові високого рівня на власний машинний код.
- 3) Лінкер – Об’єднати різні посилання на файли програми у вашій головній програмі.
- 4) Навантажувач – Завантажити файли з вашого додаткового пристрою зберігання даних, такого як жорсткий диск, флеш-накопичувач або компакт-диск, в оперативну пам’ять для виконання. Завантаження відбувається автоматично під час виконання коду.
- 5) Виконання – Фактичне виконання коду, яке обробляється вашою ОС та процесором.
З огляду на це, перегляньте наступне відео та дізнайтеся про внутрішню роботу JVM та архітектуру JVM (Java Virtual Machine).
Натисніть тут якщо відео недоступне
Процес компіляції та виконання коду C
Щоб зрозуміти Java процес компіляції, давайте спочатку коротко розглянемо процес компіляції та компонування в C.
Припустимо, що у функції main ви викликали дві функції, f1 та f2. Функція main зберігається у файлі a1.c.
Функція f1 зберігається у файлі a2.c.
Функція f2 зберігається у файлі a3.c.
Усі ці файли, тобто a1.c, a2.c та a3.c, передаються компілятору, виходом якого є відповідні об'єктні файли, що є машинним кодом.
Наступний крок – інтеграція всіх цих об’єктних файлів в один .exe-файл за допомогою лінкера. Лінкер об’єднає всі ці файли разом та створить .exe-файл.
Під час виконання програми програма-завантажувач завантажить файл a.exe в Оперативна пам'ять для виконання.
Java Компіляція та виконання коду в Java VM
Тепер давайте розглянемо процес для JavaУ вашому основному випадку є два методи: f1 та f2.
- Основний метод зберігається у файлі a1.java.
- f1 зберігається у файлі як a2.java
- f2 зберігається у файлі як a3.java
Компілятор скомпілює три файли та створить три відповідні файли .class, які складаються з BYTE-коду. На відміну від C, зв'язування не виконується.
Команда Java ВМ, або Java Віртуальна машина знаходиться в оперативній пам'яті. Під час виконання, за допомогою завантажувача класів, файли класів переносяться в оперативну пам'ять. BYTE-код перевіряється на наявність будь-яких порушень безпеки.
Далі, механізм виконання перетворить байт-код у власний машинний код. Це компіляція «точно в часі». Це одна з головних причин, чому 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 є:
- Динамічне зв'язування: На відміну від C, зв’язування здійснюється під час виконання, кожного разу, коли запускається програма Java.
- Інтерпретатор часу виконання: Перетворення байт-коду в власний машинний код виконується під час виконання в Java, що ще більше уповільнює швидкість.
Однак, останні версії Java значною мірою вирішили ці проблеми з продуктивністю.











