Що таке JVM? Поясніть JVM Archiтектура

⚡ Розумний підсумок

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

  • 🧩 Байт-кодовий міст: Команда Java Компілятор створює байт-код замість машинного коду, а JVM інтерпретує цей байт-код на будь-якій хост-системі.
  • 🏗️ Core Archiтекстура: JVM поєднує завантажувач класів, область методів, купу, стеки, регістри PC та механізм виконання для запуску програм.
  • 🔄 Послідовність компіляції: На відміну від C, Java не потребує зв'язування; файли класів завантажуються в оперативну пам'ять, перевіряються, а потім виконуються під час виконання.
  • JIT-компілятор: Компілятор Just-In-Time перетворює байт-код у власний машинний код під час виконання для покращення продуктивності.
  • ???? Примітка щодо продуктивності: Динамічне зв'язування та інтерпретація під час виконання історично роблять Java повільніше, хоча сучасні версії значною мірою заповнюють цей розрив.

JVM Archiтектура

Що таке JVM Java?

Java Віртуальна машина (JVM) це двигун, який забезпечує середовище виконання для керування Java код або програми. Він перетворює Java байт-код на машинну мову. JVM є частиною Java Середовище виконання (JRE). В інших мовах програмування компілятор створює машинний код для певної системи. Однак Java компілятор створює код для віртуальної машини, відомої як Java Віртуальна машина.

Як працює JVM?

По-перше, Java код компілюється в байт-код. Цей байт-код інтерпретується на різних машинах. Між хост-системою та Java джерело, байт-код є проміжною мовою. JVM у Java відповідає за розподіл пам'яті.

Робота з Java Віртуальна машина JVM

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

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

Тепер давайте розберемося з архітектурою JVM. Архітектура JVM в Java містить завантажувач класів, область пам'яті, механізм виконання та багато іншого.

JVM Archiтектура

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.

Головна функція 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-файл

Під час виконання програми програма-завантажувач завантажить файл a.exe в Оперативна пам'ять для виконання.

Завантажувач коду C завантажує exe-файл в оперативну пам'ять

Java Компіляція та виконання коду в Java VM

Тепер давайте розглянемо процес для JavaУ вашому основному випадку є два методи: f1 та f2.

  • Основний метод зберігається у файлі a1.java.
  • f1 зберігається у файлі як a2.java
  • f2 зберігається у файлі як a3.java

Java код компілює три файли у файли класів

Компілятор скомпілює три файли та створить три відповідні файли .class, які складаються з BYTE-коду. На відміну від C, зв'язування не виконується.

Команда Java ВМ, або Java Віртуальна машина знаходиться в оперативній пам'яті. Під час виконання, за допомогою завантажувача класів, файли класів переносяться в оперативну пам'ять. BYTE-код перевіряється на наявність будь-яких порушень безпеки.

Java завантажувач класів переносить файли класів в оперативну пам'ять

Далі, механізм виконання перетворить байт-код у власний машинний код. Це компіляція «точно в часі». Це одна з головних причин, чому 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 запускає фреймворки штучного інтелекту та великих даних, такі як Deeplearning4j, Weka та Apache. SparkЙого компілятор Just-In-Time та управління пам'яттю дозволяють цим бібліотекам ефективно обробляти великі набори даних на різних платформах без переписування рідного коду.

Так. Профайлери за допомогою штучного інтелекту можуть аналізувати журнали збору сміття, пропонувати розміри купи та позначати повільні методи. Вони допомагають налаштовувати прапорці JVM та швидше виявляти вузькі місця, хоча розробник все одно повинен перевіряти кожну рекомендовану зміну.

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

Байт-код не залежить від платформи, але сама JVM також залежить від платформи. Кожній операційній системі потрібна власна реалізація JVM. Така конструкція дозволяє тому ж скомпільованому байт-коду запускатися будь-де, де встановлена ​​сумісна JVM.

Підсумуйте цей пост за допомогою: