Czym jest JVM? Wyjaśnij, czym jest JVM Architektura

⚡ Inteligentne podsumowanie

Java Maszyna wirtualna (JVM) to silnik zapewniający środowisko wykonawcze do obsługi Java kod, konwertujący niezależny od platformy kod bajtowy na natywny język maszynowy. Stanowi część Java Środowisko wykonawcze i umożliwia Javamobilność — napisz raz i uruchom gdziekolwiek chcesz.

  • 🧩 Most bajtkodu: Java Kompilator generuje kod bajtowy zamiast kodu maszynowego, a JVM interpretuje ten kod bajtowy na dowolnym systemie hosta.
  • 🏗️. rdzeń Archistruktura: JVM łączy w sobie ClassLoader, obszar metod, stos, rejestry PC i silnik wykonawczy w celu uruchamiania programów.
  • 🔄 Przebieg kompilacji: W odróżnieniu od C. Java nie wymaga łączenia; pliki klas są ładowane do pamięci RAM, weryfikowane, a następnie wykonywane w czasie wykonywania.
  • Kompilator JIT: Kompilator Just-In-Time konwertuje bajtkod na natywny kod maszynowy w trakcie wykonywania, aby zwiększyć wydajność.
  • 🐢 Uwaga dotycząca wydajności: Historycznie rzecz biorąc, dynamiczne łączenie i interpretacja w czasie wykonywania sprawiają, że Java wolniejsze, choć nowsze wersje w dużej mierze niwelują tę różnicę.

FMV Architektura

Czym jest JVM Java?

Java Maszyna wirtualna (JVM) to silnik zapewniający środowisko wykonawcze do obsługi Java kod lub aplikacje. Konwertuje Java kod bajtowy na język maszynowy. JVM jest częścią Java Środowisko wykonawcze (JRE). W innych językach programowania kompilator generuje kod maszynowy dla konkretnego systemu. Jednakże Java kompilator generuje kod dla maszyny wirtualnej znanej jako Java Maszyna wirtualna.

Jak działa JVM?

Po pierwsze, Java Kod jest kompilowany do bajtkodu. Ten bajtkod jest interpretowany na różnych maszynach. Między systemem hosta a Java Źródło, bajtkod jest językiem pośrednim. JVM w Java odpowiada za przydzielanie przestrzeni pamięci.

Praca z Java Maszyna wirtualna JVM

Praca z Java Maszyna wirtualna (JVM)

Archiarchitektura JVM (Java Maszyna wirtualna)

Teraz poznajmy architekturę JVM. Architektura JVM w Java zawiera program ładujący klasy, obszar pamięci, moduł wykonujący i wiele innych.

FMV Architektura

Java Maszyna wirtualna Architektura

1) Moduł ładujący klasy
Ładowarka klas to podsystem służący do ładowania plików klas. Wykonuje trzy główne funkcje: ładowanie, łączenie i inicjalizację.

2) Obszar metody
Obszar metod JVM przechowuje struktury klas, takie jak metadane, stałą pulę wykonawczą i kod metod.

3) Kupa
Wszystko Obiekty, powiązane z nimi zmienne instancji i tablice są przechowywane na stercie. Ta pamięć jest wspólna i współdzielona przez wiele wątków.

4) Stosy językowe JVM
Java Stosy językowe przechowują zmienne lokalne i ich częściowe wyniki. Każdy wątek ma swój własny stos JVM, tworzony jednocześnie z tworzeniem wątku. Nowa ramka jest tworzona za każdym razem, gdy wywoływana jest metoda, i jest usuwana po zakończeniu procesu wywoływania metody.

5) Rejestry komputerów
Rejestr PC przechowuje adres Java Instrukcja maszyny wirtualnej, która jest aktualnie wykonywana. W Java, każdy wątek ma swój własny, oddzielny rejestr PC.

6) Stosy metod natywnych
Stosy metod natywnych przechowują instrukcje kodu natywnego, które zależą od biblioteki natywnej. Są one napisane w innym języku, a nie w Java.

7) Silnik wykonawczy
Silnik wykonawczy odczytuje bajtkod i wykonuje go fragment po fragmencie. Używa interpretera i kompilatora Just-In-Time (JIT), aby przekonwertować bajtkod na natywny kod maszynowy i go uruchomić.

8) Interfejs metody natywnej
Natywny interfejs metod jest frameworkiem programistycznym. Pozwala Java kod działający w JVM, który wywołuje aplikacje natywne i biblioteki, i jest przez nie wywoływany.

9) Biblioteki metod natywnych
Biblioteki rodzime to zbiór bibliotek rodzimych (C, C++), które są potrzebne silnikowi wykonawczemu.

Oprogramowanie Code Proces kompilacji i wykonania

Aby napisać i uruchomić program komputerowy, potrzebne są następujące elementy:

  • 1) Redaktor – Aby wpisać swój program, można wykorzystać do tego notatnik.
  • 2) kompilator – Aby przekonwertować program napisany w języku wysokiego poziomu na natywny kod maszynowy.
  • 3) Linker – Aby połączyć różne odwołania do plików programu w programie głównym.
  • 4) Ładowarka – Aby załadować pliki z dodatkowego urządzenia pamięci masowej, takiego jak dysk twardy, pendrive lub płyta CD, do pamięci RAM w celu wykonania. Ładowanie odbywa się automatycznie po uruchomieniu kodu.
  • 5) Wykonanie – Faktyczne wykonanie kodu, za które odpowiada system operacyjny i procesor.

Mając to na uwadze, zapoznaj się z poniższym filmem i poznaj wewnętrzne działanie i architekturę JVM (Java maszyna wirtualna).

Kliknij w tym miejscu jeśli film nie jest dostępny

Proces kompilacji i wykonania kodu C

Aby zrozumieć Java Proces kompilacji, przyjrzyjmy się najpierw pokrótce procesowi kompilacji i łączenia w języku C.

Załóżmy, że w funkcji głównej wywołałeś dwie funkcje: f1 i f2. Funkcja główna jest zapisana w pliku a1.c.

Główna funkcja kodu C a1.c

Funkcja f1 jest zapisana w pliku a2.c.

Funkcja kodu C f1 a2.c

Funkcja f2 jest zapisana w pliku a3.c.

Funkcja kodu C f2 a3.c

Wszystkie te pliki, tj. a1.c, a2.c i a3.c, trafiają do kompilatora, którego wyjściem są odpowiednie pliki obiektowe, które są kodem maszynowym.

Kompilator kodu C generuje pliki obiektowe

Następnym krokiem jest zintegrowanie wszystkich plików obiektowych w jeden plik .exe za pomocą konsolidatora. Konsolidator połączy wszystkie pliki i utworzy plik .exe.

Łącznik kodu C generuje plik exe

Podczas działania programu program ładujący załaduje plik a.exe do RAM do wykonania.

Program ładujący kod C ładuje plik exe do pamięci RAM

Java Kompilacja i wykonanie kodu w Java VM

Przyjrzyjmy się teraz procesowi JavaW swoim main masz dwie metody: f1 i f2.

  • Metoda główna jest przechowywana w pliku a1.java
  • f1 jest przechowywany w pliku jako a2.java
  • f2 jest przechowywany w pliku jako a3.java

Java kod kompiluje trzy pliki do plików klasowych

Kompilator skompiluje trzy pliki i wygeneruje trzy odpowiadające im pliki .class, które będą zawierały kod BYTE. W przeciwieństwie do języka C, nie stosuje się żadnego linkowania.

Java VM, złoto Java Maszyna wirtualna znajduje się w pamięci RAM. Podczas wykonywania, za pomocą programu ładującego klasy, pliki klas są przenoszone do pamięci RAM. Kod BAJTOWY jest weryfikowany pod kątem ewentualnych naruszeń bezpieczeństwa.

Java program ładujący klasy przenosi pliki klas do pamięci RAM

Następnie silnik wykonawczy konwertuje bajtkod na natywny kod maszynowy. To kompilacja just-in-time. To jeden z głównych powodów, dla których… Java jest stosunkowo powolny.

Java silnik wykonawczy konwertuje bajtkod na kod natywny

UWAGA: JIT, czyli kompilator Just-in-time, jest częścią Java Maszyna wirtualna (JVM). Interpretuje fragmenty kodu bajtowego o podobnej funkcjonalności w tym samym czasie.

Dlaczego Java zarówno język interpretowany, jak i kompilowany?

Języki programowania są klasyfikowane jako:

  • Język wyższego poziomu, np. C++, Java
  • Języki średniego poziomu, np. C
  • Język niskiego poziomu, np. Assembly
  • Wreszcie najniższy poziom to język maszynowy

A kompilator to program, który konwertuje program z jednego poziomu języka na inny. Na przykład konwersja C++ program w kodzie maszynowym. Java kompilator konwertuje wysokiego poziomu Java kod na kod bajtowy (który jest również rodzajem kodu maszynowego).

An interpretator jest programem, który konwertuje program na jednym poziomie na inny język programowania na tym samym poziomie ten sam poziomNa przykład konwersja Java zaprogramować w C++.

In JavaGenerator kodu Just-In-Time konwertuje bajtkod na natywny kod maszynowy, które znajdują się na tym samym poziomie programowania. W związku z tym, Java jest zarówno językiem kompilowanym, jak i interpretowanym.

Dlaczego Java powolny?

Dwie główne przyczyny powolności Java należą:

  1. Linkowanie dynamiczne: W przeciwieństwie do C, łączenie odbywa się w czasie wykonywania, za każdym razem, gdy program jest uruchamiany Java.
  2. Interpreter czasu wykonania: Konwersja kodu bajtowego na natywny kod maszynowy odbywa się w czasie wykonywania Java, co jeszcze bardziej spowalnia prędkość.

Jednak najnowsze wersje Java w dużym stopniu rozwiązano te problemy z wydajnością.

FAQ

Na JVM działają takie frameworki jak Deeplearning4j, Weka i Apache, jak AI i Big Data. SparkKompilator Just-In-Time i zarządzanie pamięcią umożliwiają tym bibliotekom wydajne przetwarzanie dużych zbiorów danych na różnych platformach bez konieczności ponownego pisania kodu natywnego.

Tak. Profilery wspomagane sztuczną inteligencją mogą analizować logi zbierania śmieci, sugerować rozmiary stosu i sygnalizować powolne metody. Pomagają one dostroić flagi JVM i szybciej wykrywać wąskie gardła, choć programista powinien nadal weryfikować każdą zalecaną zmianę.

JVM uruchamia kod bajtowy. Środowisko JRE zawiera w pakiecie JVM z podstawowymi bibliotekami potrzebnymi do uruchomienia Java programy. JDK dodaje narzędzia programistyczne, takie jak kompilator i debugger, dlatego służy do tworzenia aplikacji.

Kod bajtowy jest niezależny od platformy, ale sama maszyna wirtualna Java (JVM) jest zależna od platformy. Każdy system operacyjny wymaga własnej implementacji maszyny wirtualnej Java. Taka konstrukcja pozwala na uruchomienie tego samego skompilowanego kodu bajtowego wszędzie tam, gdzie zainstalowana jest kompatybilna maszyna wirtualna Java.

Podsumuj ten post następująco: