Как работи JVM - JVM архитектура

Как работи JVM - JVM архитектура

Java Virtual Machine (JVM) е основен компонент на Java Runtime Environment (JRE), който позволява на Java програмите да работят на всяка платформа без модификация. JVM действа като интерпретатор между байт кода на Java и основния хардуер, осигуряващ известната възможност на Java Write Once Run Anywhere (WORA).

  • Източник на Java (.java) -> компилиран от javac -> байт код (.class)
  • JVM зарежда байт кода, проверява дали го свързва и след това го изпълнява
  • Изпълнението може да включва интерпретиране на байт код или използване на Just-In-Time (JIT) компилация за преобразуване на горещ код в собствен машинен код за производителност
  • Събирането на боклук работи във фонов режим, за да освободи памет от неизползвани обекти

Архитектура на JVM

Изображението по-долу демонстрира архитектурата и ключовите компоненти на JVM.

Jvm

Компоненти на JVM архитектурата

Сега ще обсъдим подробно всеки компонент на JVM.



1. Подсистема за зареждане на класове

Отговаря основно за три дейности. 

class_loader_subsystem

1. Зареждане

  • Чете .class файлове и съхранява метаданни на класа в областта на метода.
  • Създава обект Class в купчината, представляващ заредения клас.
Java
   class   GFG  {          static  {          System  .  out  .  println  (  'GFG class is loaded by the JVM!'  );      }      public     void     display  (){          System  .  out  .  println  (  'Method of GFG class is executed.'  );      }   }   public     class   Test  {      public     static     void     main  (  String  []     args  )     throws     Exception  {          System  .  out  .  println  (  'Main method started.'  );      // Loading the class explicitly using Class.forName()      Class  .  forName  (  'GFG'  );      System  .  out  .  println  (  'Class loaded successfully.'  );      // Creating object to execute method      GFG     obj     =     new     GFG  ();      obj  .  display  ();      }   }   

Изход
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.  

Забележка: За всеки зареден .клас само файл един обект на класа е създаден.

2. Свързване: Отговаря за подготовката на заредения клас за изпълнение. Тя включва три стъпки:

  • Проверка: Гарантира, че байт кодът следва правилата на JVM и е безопасен за изпълнение.
  • Приготвяне: Разпределя памет за статични променливи и присвоява стойности по подразбиране.
  • Резолюция: Преобразува символни препратки в директни препратки в паметта.

3. Инициализация

  • Присвоява действителни стойности на статичните променливи.
  • Изпълнява статични блокове, дефинирани в класа.

Типове зареждащи класове

  • Зареждащ клас на Bootstrap: Зарежда основни Java класове (JAVA_HOME/lib).
  • Зареждащ клас на разширение: Зарежда класове от директорията с разширения (JAVA_HOME/jre/lib/ext).
  • Зареждащ клас система/приложение: Зарежда класове от класовия път на приложението.
Java
   // Java code to demonstrate Class Loader subsystem   public     class   Geeks      {      public     static     void     main  (  String  []     args  )      {      // String class is loaded by bootstrap loader and      // bootstrap loader is not Java object hence null      System  .  out  .  println  (  String  .  class  .  getClassLoader  ());      // Test class is loaded by Application loader      System  .  out  .  println  (  Geeks  .  class  .  getClassLoader  ());      }   }   

Изход
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f  

2. JVM области на паметта

  • Област на метода: Съхранява информация на ниво клас като име на клас родителски клас методи променливи и статични данни. Споделя се в JVM.
  • Heap площ: Съхранява всички обекти. Споделя се в JVM.
  • Площ на стека: Всяка нишка има свой собствен стек за изпълнение; методът съхранява извиква локални променливи в рамките на стека. Унищожава се, когато нишката свърши.
  • PC регистри: Съхранявайте адреса на текущо изпълняваната инструкция за всяка нишка.
  • Нативни стекове на метода: Всяка нишка има отделен стек за изпълнение на естествен метод.

3. Двигател за изпълнение 

Механизмът за изпълнение изпълнява .class (байт код). Той чете байт кода ред по ред, използва данни и информация, налични в различни области на паметта, и изпълнява инструкции. Тя може да бъде класифицирана в три части:

  • Преводач: Той интерпретира байт кода ред по ред и след това се изпълнява. Недостатъкът тук е, че когато един метод се извиква многократно, всеки път се изисква интерпретация.
  • Компилатор точно навреме (JIT): Използва се за повишаване на ефективността на преводач. Той компилира целия байткод и го променя в собствен код, така че всеки път, когато интерпретаторът види повтарящи се извиквания на метод, JIT предоставя директен естествен код за тази част, така че не е необходима повторна интерпретация, като по този начин ефективността се подобрява.
  • Събирач на боклук: Унищожава нереферирани обекти. За повече информация относно Garbage Collector вижте Събирач на боклук .

4. Java Native Interface (JNI)

Това е интерфейс, който взаимодейства с Native Method Libraries и предоставя собствените библиотеки (C C++), необходими за изпълнението. Той позволява на JVM да извиква C/C++ библиотеки и да бъде извикван от C/C++ библиотеки, които може да са специфични за хардуера.

5. Библиотеки за собствени методи

Това са колекции от собствени библиотеки, необходими за изпълнение на собствени методи. Те включват библиотеки, написани на езици като C и C++.


Създаване на тест

Топ Статии

Категория

Интересни Статии