Articles

Architektura JVM i jak to działa?

Prabhu Rajendran

Follow

Mar 28, 2019 – 3 min read

Every Java Developer Knows bytecode jest wykonywany przez JRE , ale JRE jest implementacją JVM. „która analizuje kod bajtowy, interpretuje kod i wykonuje go”.

Maszyna wirtualna jest programową implementacją maszyny fizycznej.Java została opracowana z koncepcją WORA (Write Once Run Anywhere).Kompilator kompiluje plik java do pliku klasy, następnie plik .class jest wprowadzany do JVM, która go ładuje i wykonuje.

Jak działa JVM?

  1. Podsystem ładowania klas
  2. Obszar danych czasu rzeczywistego
  3. Silnik wykonawczy.

Teraz, Przejdźmy do każdej części.

1.Podsystem Class Loader :

Funkcjonalność dynamicznego ładowania klas Javy jest obsługiwana przez podsystem class loader. „Załaduj -> Połącz -> Zainicjuj plik klasy” po raz pierwszy w runtime.

1.1. Ładowanie : Klasy będą ładowane przez ten komponent.

  1. Bootstrap Class Loader – ładuje klasy ze ścieżki klasy bootstrap (rt.jar -high priority)
  2. Extension Class Loader – ładuje klasy zawarte w (jre/lib).
  3. Application Class Loader – ładuje klasy poziomu aplikacji.

1.2 Linkowanie : Wykonuje Weryfikację, Przygotowanie i Rozdzielczość na załadowanej klasie.

  1. Weryfikacja : Weryfikator Bajtkodu zweryfikuje czy wygenerowany bajtkod jest poprawny czy nie, w przeciwnym razie otrzymamy Błąd Weryfikacji(java.lang.VerifyError)
  2. Przygotowanie : Dla wszystkich zmiennych statycznych w bajtkodzie, pamięć zostanie zaalokowana i załadowane zostaną wartości domyślne.
  3. Resolve(Optional): Symboliczne referencje klasy zostaną zastąpione oryginalnymi referencjami z obszaru metod.

1.3 Inicjalizacja : Końcowa faza programu ładującego klasy, tutaj wszystkie zmienne statyczne będą miały przypisane oryginalne wartości & blok statyczny zostanie wykonany.

2. Runtime Data Area : (JVM Memory) – podzielony na 5 komponentów

  1. Method Area : będzie przechowywał wszystkie dane na poziomie klasy (pola, metody, zmienne statyczne). Tylko jeden obszar metod na JVM.
  2. Obszar sterty : wszystkie obiekty & odpowiadające instancji, zmiennej, tablicy będą przechowywane. Jeden Heap na JVM
  • gdzie Heap & Obszar metody nie są bezpieczne dla wątków to współdzielony zasób dla JVM

3. Obszar stosu : Dla każdego wątku nowy stos w czasie wykonywania zostanie utworzony. Dla każdego wywołania metody, jeden wpis zostanie dodany do stosu zwanego stosem.

  1. Zmienna lokalna będzie przechowywana w pamięci stosu
  2. Bezpieczne dla wątków
  3. Stos jest podzielony na trzy podjednostki:

3.1.1 Local Variable Array: związane z lokalną metodą, zmienne są przywoływane

3.2 Operand Stack: Operacja pośrednia – działa jako przestrzeń robocza runtime do wykonywania operacji

3.3 Frame Data: wszystkie symbole odpowiadające metodzie będą przechowywane, w przypadku wyjątków, informacje o catch block będą utrzymywane.

4.PC Registers: Każdy wątek będzie posiadał rejestr, który będzie przechowywał aktualnie wykonywaną operację (po aktualizacji każdej instrukcji, rejestr PC również będzie aktualizował następną instrukcję)

5. Stos metod natywnych: Przechowuje informacje o metodach natywnych dla każdego wątku.

3. Execution Engine : Kod bajtowy, który jest przypisany do obszaru danych Runtime, zostanie wykonany.

  1. Interpreter: Interpretuje kod bajtowy szybciej, ale wykonanie wolniej.(jedna metoda jest wywoływana wiele razy to stworzy nową Interpretacja jest wymagana).
  2. JIT Compiler : neutralizuje wadę interpretera.zawsze, gdy znajdzie powtarzający się kod używa JIT Compiler.

Kompiluje on kod bajtowy do kodu natywnego (kod natywny będzie używany bezpośrednio do powtarzających się wywołań metod).

Generator kodu pośredniego : Generuje kod pośredni, gdy jest to wymagane

Optymalizator kodu: Optymalizuje kod

Target Code Generator : Konwertuje do Machine / Native Code

Profiler: Pomaga znaleźć wielokrotne wywołania metod (znajdowanie hotspotów)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *