Вступ у віртуальну машину Java
У цій статті ми дізнаємось про віртуальну машину Java, яка називається "JVM". Віртуальна машина Java - це віртуальна машина, яка дозволяє комп'ютерній системі запускати / виконувати програми Java. В основному, JVM - це двигун, який працює як середовище виконання для коду Java. JVM перетворює код Java в машинну мову. Коли ви запускаєте компільований файл .class, він переходить до JVM, а потім JVM повертає результат. Віртуальна машина Java є частиною JRE, яка розшифровується як "середовище виконання Java". Основні завдання для віртуальної машини Java складаються з завантаження коду, а потім перевірки коду та виконання коду. Також надайте середовище виконання для виконання коду. JVM складається з різних компонентів, таких як Classloader, Список простору, призначений JVM як Stack, Execution Engine та декілька власних бібліотек.
Архітектура віртуальної машини Java 
Як показано на зображенні вище, архітектура віртуальної машини Java складається з різних компонентів. Давайте дізнаємося про кожен конкретний компонент окремо.
Навантажувач
Як випливає з назви, це компонент, відповідальний за завантаження файлів класу. Завантаження, з'єднання та ініціалізація файлу класу - основні функції навантажувача. Навантажувач робить це під час виконання.
- Завантаження: В основному завантажувач зчитує файл .class, потім генерує двійковий код і зберігає його в області методу. Завантажувач Classloader, розширення Classloader і завантажувач додатків - це різні ClassLoaders, відповідальні за завантаження різних класів.
- Пов’язання: три основні функції, такі як перевірка, підготовка та вирішення. Він починається з перевірки файлу .class. Якщо перевірка не вдається, вона дає виключення для перевірки часу виконання. Пізніше пам'ять розподіляється за змінними зі значеннями за замовчуванням. Потім, нарешті, символічні посилання на пам'ять замінюються на прямі посилання з області пам'яті.
- Ініціалізація: Це заключна частина ClassLoader. Вихідні значення присвоюються всім статичним змінним з подальшим виконанням статичного блоку. Ця частина виконується від верху до низу класу.
Купи
Тут зберігаються подробиці змінних об'єктів та примірників. Це спільна пам'ять, що означає, що збережені тут дані не є безпечними для потоків.
Виняток у потоці "main" java.lang.OutOfMemoryError: Куповий простір Java
Однією з найбільш відносних помилок є виняток "OutOfMemoryError ", який означає, що JVM не може виділити об'єкт у зоні Heap, або виділення пам'яті не може бути виконано для одного об'єкта.
Стек
Тут створюється окремий стек виконання для кожного нового потоку. Також відомий як стек Run-Time, кожен раз, коли викликається метод, всі деталі зберігаються у відповідному стенді виконання, а після завершення методу ці деталі видаляються зі стека.
Реєстри ПК
Для кожного потоку створюється окремий реєстр ПК (лічильник програм), який зберігає адресу поточної інструкції виконання, яка згодом буде оновлена наступною інструкцією. Ця область пам'яті досить мала і має фіксований розмір.
Рідний метод стека
Це одна з власних областей пам’яті, яка викликається потоком, а потім потік перебуває на абсолютно новому рівні, де обмеження в структурі та безпеці, передбачені віртуальною машиною Java, вже не виконуються. Порівняно з іншими областями пам’яті часу виконання, пам’ять, зайнята нативним стеком методів, не має фіксованого розміру, без обмежень у прирості чи зменшенні.
Java Native Interface
JNI просто взаємодіє з наведеними нижче Бібліотеками Native Method, які реалізуються на C, C ++, і надають те ж саме механізму виконання. Прямий доступ до асемблерного коду дозволений JNI. Для JVM, Java та Native - це два типи кодів. JNI плавно встановлює чітко визначений зв'язок між цими двома.
Бібліотеки рідного методу
Збірник рідних бібліотек, як того вимагає виконавчий механізм.
Виконання двигуна
Ну, тепер у нас є програма java в байт-коді, яка присвоюється вищеописаним областям даних за допомогою завантажувача класів, і тепер байт-код буде виконаний механізмом виконання. Execution Engine просто зчитує байт-код в одиницях, як машинне зчитування рядків коду одна за одною. Байтовий код - це читаний людиною формат, саме тому машина не може його прочитати, і він повинен бути перетворений у машиночитаний формат, де наведені нижче компоненти використовуються для інтерпретації.
Виконавчий механізм має три основні компоненти - перекладач, компілятор JIT та збирач сміття.
1. Перекладач
Просто виконується байт-код послідовним методом. Виклик здійснюється запитом командного рядка зі складеним файлом як аргументом. Інтерпретатор досить швидкий в інтерпретації та виконанні команд одна за одною, що відбувається швидше, ніж компілятор JIT для складання коду.
назва класу java
Основний () клас повинен бути у зібраному файлі .class.
2. Компілятор JIT
Один з найважливіших компонентів середовища виконання Java, який підвищує продуктивність програми Java під час виконання. Жоден інший компонент не має більшого впливу на продуктивність, ніж компілятор JIT. Це компілятор за замовчуванням і активується, коли викликається будь-який метод Java.
3. Збирач сміття
Як випливає з назви, це має щось спільне зі сміттям, Garbage Collector просто шукає кожен можливий об’єкт, наявний у купі простору JVM, перевіряє, чи він використовується, а потім видаляє невикористані. Отже, він просто позначає фрагменти пам'яті, які використовуються чи ні. Потім він продовжує підмітати, де просто видаляє позначений об’єкт. Найкращим випадком є відсутність системи ручного розподілення пам'яті, оскільки колектор сміття виконує завдання автоматичного видалення невикористаного простору пам'яті. Але оскільки це автоматичне завдання, жоден програміст не має контролю над плануванням будь-якого інтервалу часу для конкретного завдання очищення і не потребує більшої потужності процесора під час пошуку посилань на об'єкти.
Висновок
Хоча не обов’язково мати чітке розуміння того, як працює JVM, для написання коду Java це дуже корисно. Для розробника, який розуміє роботу JVM, він напише кращий і оптимізований код, як би довгий або складний це не було. Окрім наведеного тут опису, JVM пропонує широкий спектр функцій та технологій. Ці функції можна використовувати для поліпшення продуктивності за потребою конкретного постачальника
Рекомендовані статті
Це посібник щодо віртуальної машини Java. Тут ми обговорюємо архітектуру віртуальної машини Java разом з її різними компонентами. Ви також можете переглянути наступні статті, щоб дізнатися більше -
- Сортування бульбашок у JavaScript
- Життєвий цикл теми на Java
- Що таке Java SE?
- Кращі компілятори Java
- JRE проти JVM | 8 найкращих відмінностей (Інфографіка)