Java виртуална машина - Ръководство за архитектура на JVM с неговия компонент

Съдържание:

Anonim

Въведение в виртуалната машина на Java

В тази статия ще научим за виртуалната машина на Java, известна още като JVM. Java Virtual Machine е виртуална машина, която позволява на компютърна система да стартира / изпълнява Java програми. По принцип JVM е двигател, който работи като среда за изпълнение на Java код. JVM преобразува Java кода в машинен език. Когато стартирате компилиран .class файл, той отива в JVM и след това JVM връща изхода. Java виртуалната машина е част от JRE, която означава „Java Runtime Environment“. Основните задачи за виртуална машина на Java се състоят от зареждане на кода, след това проверете кода и изпълнете кода. Също така, осигурете среда за изпълнение за изпълнение на код. JVM се състои от различни компоненти като Classloader, Списък на пространството, зададен от JVM като Stack, Execution Engine и няколко местни библиотеки.

Архитектурата на виртуалната машина на Java

Както е показано на изображението по-горе, Java Virtual Machine Architecture се състои от различни компоненти. Нека научим за всеки конкретен компонент поотделно.

товарач

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

  • Зареждане: По принцип товарачът чете .class файла, след което генерира двоичния код и го записва в област на метод. Bootstrap Classloader, Extension Classloader и Application Classloader са различните ClassLoaders, отговорни за зареждането на различни класове.
  • Свързване: Три основни функции като проверка, подготовка и разрешаване. Започва с проверка на .class файл. Ако проверката не успее, тя дава изключение за проверка на времето за изпълнение. По-късно паметта се разпределя към променливите със стойности по подразбиране. След това, накрая, символните препратки към паметта се заменят с директна референция от областта на паметта.
  • Инициализиране: Това е последна част от ClassLoader. Оригиналните стойности са присвоени на всички статични променливи, последвани от изпълнението на Static Block. Тази част се изпълнява от върха до дъното на клас.

купчина

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

Изключение в нишката „main“ java.lang.OutOfMemoryError: Java heap space

Една от най-относимите грешки е изключението „OutOfMemoryError , което означава, че JVM не може да разпредели обект в областта Heap или разпределението на паметта не може да се извърши за същия обект.

купчина

Тук се създава отделен стек за изпълнение за всяка нова тема. Известен също като Stack-Run Stack, всеки път когато се извиква метод, всички детайли се съхраняват в съответния стенд за изпълнение и след приключване на метода, тези подробности се премахват от стека.

PC регистри

За всеки отделен поток се създава отделен регистър на компютъра (брояч на програми), който съхранява адреса на текущата инструкция за изпълнение, която по-късно ще бъде актуализирана със следващата инструкция. Тази памет е доста малка и е с фиксиран размер.

Native метод стека

Това е един от собствените му видове памет, който се извиква от нишка и след това нишката е на съвсем ново ниво, където структурата и ограниченията за сигурност, наложени от Java Virtual Machine, вече не се упражняват. В сравнение с други области на паметта по време на работа, паметта, заета от нативните стекове на метод, няма фиксиран размер, без ограничения при нарастване или намаляване.

Java Native интерфейс

JNI просто взаимодейства със споменатите по-долу библиотеки за Native Method, които са с C, C ++ изпълнение и предоставят същото на двигателя за изпълнение. Директен достъп до код за сглобяване е разрешен от JNI. За JVM, Java и Native са двата типа кодове. JNI гладко установява добре дефинирана връзка между тези две.

Библиотеки за родния метод

Колекция от битови библиотеки, както се изисква от двигателя за изпълнение.

Изпълняващ двигател

Е, сега имаме java програма в байт код, който се присвоява на гореописаните области с данни чрез класово зареждане, а сега байт кодът ще се изпълнява от двигателя за изпълнение. Execution Engine просто чете байтовия код на единици, като машинно четене на кодови редове една по една. Байтовият код е четим от човека формат, поради което машината не може да го чете, тъй като той е и трябва да бъде преобразуван в машинно четим формат, където по-долу компонентите се използват за целта на интерпретацията.

Execution Engine има три основни компонента, които са Interpreter, JIT Compiler и Garbage Collector.

1. Преводач

Просто изпълнява байтовия код в последователен метод. Обаждането се извършва чрез заявка от команден ред с компилиран файл като аргумент. Интерпретаторът е доста бърз при интерпретиране и изпълнение на команди по една, което се случва по-бързо от компилатора на JIT за съставяне на кода.

име на клас java

Основният () клас е задължително в компилиран .class файл.

2. Съставител JIT

Един от най-важните компоненти на Java Runtime Environment, който повишава производителността на Java приложението по време на изпълнение. Никой друг компонент няма по-голямо въздействие върху производителността от компилатора JIT. Това е компилатор по подразбиране и се активира, когато се извиква всеки Java метод.

3. Събирач на боклук

Както подсказва името, той има нещо общо с боклука, Garbage Collector просто търси всеки възможен обект, наличен в купата на JVM, проверява дали се използва и след това изтрива неизползваните. Така че той просто маркира частите памет, които се използват или не. След това продължава метенето, където просто премахва маркирания обект. Най-добрият случай за използване е, че не е необходима система за ръчно разпределение на паметта, тъй като Garbage Collector върши задачата да премахва неизползваното място в паметта автоматично. Но тъй като това е автоматична задача, никой програмист няма контрол върху планирането на времевия интервал за конкретно почистване и не изисква повече мощност на процесора, докато търси препратки към обекти.

заключение

Въпреки че не е задължително да имате ясно разбиране за това как работи JVM, за да напишете Java код, това е изключително полезно. За разработчик, който разбира работата на JVM, той ще напише по-добър и оптимизиран код, колкото и дълъг или сложен да е изискването. Освен описанието, предоставено тук, JVM предоставя широка гама от функции и технологии. Тези функции могат да се използват за подобряване на производителността според нуждите на конкретен доставчик

Препоръчителни статии

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

  1. Bubble Сортиране в JavaScript
  2. Жизнен цикъл на нишката в Java
  3. Какво е Java SE?
  4. Най-добрите компилатори на Java
  5. JRE срещу JVM | Топ 8 разлики с (Инфографика)