Co to jest JVM?
Java Virtual Machine (JVM) jest silnikiem, który zapewnia środowisko uruchomieniowe dla kodu Java lub aplikacji. Konwertuje ona kod bajtowy Javy na język maszynowy. JVM jest częścią środowiska uruchomieniowego Java (JRE). W innych językach programowania kompilator produkuje kod maszynowy dla konkretnego systemu. Jednak kompilator Javy produkuje kod dla maszyny wirtualnej znanej jako Java Virtual Machine.
Oto jak działa JVM
Po pierwsze, kod Java jest kompilowany do kodu bajtowego. Ten bajtkod jest interpretowany na różnych maszynach
Pomiędzy systemem hosta a źródłem Java, bajtkod jest językiem pośrednim.
JVM w Javie jest odpowiedzialny za przydzielanie przestrzeni pamięci.
W tym poradniku JVM, dowiesz się-
- Architektura JVM
- Kompilacja kodu oprogramowania & Proces wykonania
- Kompilacja kodu C i proces wykonania
- Kompilacja kodu Java i proces wykonania
- Dlaczego Java jest zarówno językiem interpretowanym jak i kompilowanym?
- Dlaczego Java jest powolna?
Architektura JVM
Teraz w tym tutorialu JVM, zrozumiemy architekturę JVM. Architektura JVM w Javie zawiera classloader, obszar pamięci, silnik wykonawczy itp.
1) ClassLoader
Ładowacz klas to podsystem służący do ładowania plików klas. Wykonuje on trzy główne funkcje viz. ładowanie, łączenie i inicjalizację.
2) Method Area
JVM Method Area przechowuje struktury klas takie jak metadane, pulę stałych runtime oraz kod metod.
3) Sterta
Wszystkie obiekty, powiązane z nimi zmienne instancji i tablice są przechowywane w stercie. Pamięć ta jest wspólna i współdzielona przez wiele wątków.
4) Stosy języka JVM
Zestawy języka Java 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 przy każdym wywołaniu metody, a usuwana po zakończeniu procesu wywoływania metody.
5) Rejestry PC
Rejestry PC przechowują adres instrukcji maszyny wirtualnej Javy, która jest aktualnie wykonywana. W Javie każdy wątek ma swój osobny rejestr PC.
6) Stosy metod natywnych
Stosy metod natywnych przechowują instrukcje kodu natywnego zależne od biblioteki natywnej. Jest on napisany w innym języku niż Java.
7) Execution Engine
Jest to rodzaj oprogramowania używanego do testowania sprzętu, oprogramowania lub kompletnych systemów. Silnik wykonawczy testu nigdy nie przenosi żadnych informacji o testowanym produkcie.
8) Interfejs metod natywnych
Interfejs metod natywnych to framework programistyczny. Pozwala on kodowi Java, który jest uruchomiony w JVM, na wywoływanie przez biblioteki i aplikacje natywne.
9) Native Method Libraries
Native Libraries to zbiór bibliotek natywnych (C, C++), które są potrzebne dla silnika wykonawczego.
Kompilacja kodu oprogramowania & Proces wykonania
Aby napisać i wykonać program, potrzebujesz następujących rzeczy
1) Edytor – Do wpisania swojego programu, Notatnik może być do tego użyty
2) Kompilator – Do konwersji twojego programu w języku wysokiego poziomu na natywny kod maszynowy
3) Linker – Do połączenia różnych plików programu w twoim głównym programie razem.
4) Loader – Aby załadować pliki z twojego wtórnego urządzenia pamięci masowej, takiego jak dysk twardy, pendrive, CD do pamięci RAM w celu wykonania. Ładowanie odbywa się automatycznie, gdy wykonujesz swój kod.
5) Wykonanie – Rzeczywiste wykonanie kodu, które jest obsługiwane przez twój system operacyjny & procesor.
Z tym tłem, odnieś się do następującego wideo & poznaj wewnętrzną pracę i architekturę JVM (Java Virtual Machine).
Kliknij tutaj, jeśli wideo nie jest dostępne
Kod C Proces kompilacji i wykonywania
Aby zrozumieć proces kompilacji w Javie. Przyjrzyjmy się najpierw szybko procesowi kompilacji i linkowania w C.
Załóżmy, że w main, masz wywołane dwie funkcje f1 i f2. Główna funkcja jest przechowywana w pliku a1.c.
Funkcja f1 jest przechowywana w pliku a2.c
Funkcja f2 jest przechowywana w pliku a3.c
Wszystkie te pliki, czyli, a1.c, a2.c, i a3.c, są przekazywane do kompilatora. Którego wyjściem są odpowiednie pliki obiektowe, które są kodem maszynowym.
Kolejnym krokiem jest integracja wszystkich tych plików obiektowych w jeden plik .exe za pomocą linkera. Linker połączy wszystkie te pliki razem i wyprodukuje plik .exe.
Podczas uruchamiania programu, program ładujący załaduje plik .exe do pamięci RAM w celu wykonania.
Kompilacja kodu Javy i jego wykonywanie w maszynie wirtualnej Javy
Teraz w tym tutorialu JVM, przyjrzyjmy się procesowi dla JAVY. W twoim main, masz dwie metody f1 i f2.
- Główna metoda jest przechowywana w pliku a1.java
- f1 jest przechowywana w pliku jako a2.java
- f2 jest przechowywana w pliku jako a3.java
Kompilator skompiluje trzy pliki i wyprodukuje 3 odpowiadające im pliki .class, które składają się z kodu BYTE. W przeciwieństwie do C, nie jest wykonywane łączenie.
Maszyna wirtualna Java lub Java Virtual Machine rezyduje w pamięci RAM. Podczas wykonywania, używając programu ładującego klasy, pliki klas są przenoszone do pamięci RAM. Kod BYTE jest weryfikowany pod kątem naruszeń bezpieczeństwa.
Następnie, silnik wykonawczy przekonwertuje Bytecode na Native machine code. To jest właśnie kompilacja w czasie. Jest to jeden z głównych powodów, dla których Java jest stosunkowo powolna.
UWAGA: Kompilator JIT lub Just-in-time jest częścią wirtualnej maszyny Javy (JVM). Interpretuje część kodu bajtowego, który ma podobną funkcjonalność w tym samym czasie.
Dlaczego Java jest zarówno językiem interpretowanym jak i kompilowanym?
Języki programowania są klasyfikowane jako
- Języki wyższego poziomu, np. C++, Java
- Middle-Level Languages Ex. C
- Low-Level Language Ex Assembly
- kończąc na najniższym poziomie, jakim jest język maszynowy.
Kompilator jest programem, który konwertuje program z jednego poziomu języka na inny. Przykładem może być konwersja programu C++ na kod maszynowy.
Kompilator java konwertuje wysokopoziomowy kod java na kod bajtowy (który również jest rodzajem kodu maszynowego).
Interpreter to program, który konwertuje program na jednym poziomie na inny język programowania na tym samym poziomie. Przykład konwersji programu Java na C++
W Javie generator Just In Time Code konwertuje kod bajtowy na natywny kod maszynowy, które są na tych samych poziomach programowania.
Więc, Java jest zarówno językiem kompilowanym jak i interpretowanym.
Dlaczego Java jest powolna?
Dwa główne powody powolności Javy to
- Dynamiczne łączenie: W przeciwieństwie do C, łączenie odbywa się w czasie wykonywania, za każdym razem, gdy program jest uruchamiany w Javie.
- Interpreter czasu działania: Konwersja kodu bajtowego na natywny kod maszynowy jest wykonywana w czasie wykonywania programu w Javie, co jeszcze bardziej spowalnia prędkość
Jednakże najnowsza wersja Javy w dużym stopniu rozwiązała problem wąskich gardeł wydajności.
Podsumowanie:
- Pełna forma JVM to Java Virtual Machine. JVM w Javie jest silnikiem, który napędza kod Javy. Konwertuje on kod bajtowy Javy na język maszynowy.
- Architektura JVM w Javie zawiera classloader, obszar pamięci, silnik wykonawczy itp.
- W JVM, kod Javy jest kompilowany do kodu bajtowego. Ten bajtkod jest interpretowany na różnych maszynach
- JIT jest skrótem od Just-in-time compiler. JIT jest częścią wirtualnej maszyny Javy (JVM). Jest on używany do przyspieszenia czasu wykonania
- W porównaniu z innymi kompilatorami, JVM w Javie może być wolna w wykonaniu.
.