Wprowadzenie do wirtualnej maszyny Java
W tym artykule dowiemy się o wirtualnej maszynie Java, czyli „JVM”. Java Virtual Machine to maszyna wirtualna, która umożliwia systemowi komputerowemu uruchamianie / uruchamianie programów Java. Zasadniczo JVM to silnik, który działa jako środowisko wykonawcze dla kodu Java. JVM konwertuje kod Java na język maszynowy. Po uruchomieniu skompilowanego pliku .class przechodzi on do JVM, a następnie JVM zwraca dane wyjściowe. Java Virtual Machine jest częścią JRE, która oznacza „Java Runtime Environment”. Podstawowe zadania dla wirtualnej maszyny Java obejmują ładowanie kodu, a następnie weryfikację kodu i wykonanie kodu. Zapewnij także środowisko wykonawcze do wykonania kodu. JVM składa się z różnych komponentów, takich jak Classloader, Lista przestrzeni przypisanej przez JVM, np. Stack, silnik wykonawczy i kilka rodzimych bibliotek.
Architektura wirtualnej maszyny Java 
Jak pokazano na powyższym obrazku, architektura wirtualnej maszyny Java składa się z różnych komponentów. Dowiedzmy się o każdym konkretnym elemencie indywidualnie.
Ładowarka
Jak sama nazwa wskazuje, jest to komponent odpowiedzialny za ładowanie plików klas. Ładowanie, łączenie i inicjowanie pliku klasy to główne funkcje modułu ładującego. Program ładujący działa w czasie wykonywania.
- Ładowanie: Zasadniczo moduł ładujący czyta plik .class, a następnie generuje kod binarny i zapisuje go w obszarze metody. Bootstrap Classloader, Extension Classloader i Application Classloader to różne ClassLoadery odpowiedzialne za ładowanie różnych klas.
- Łączenie: trzy główne funkcje, takie jak weryfikacja, przygotowanie i rozwiązywanie. Zaczyna się od weryfikacji pliku .class. Jeśli weryfikacja się nie powiedzie, daje wyjątek weryfikacji w czasie wykonywania. Później pamięć jest przydzielana do zmiennych o wartościach domyślnych. Następnie symboliczne odniesienia do pamięci zostają zastąpione bezpośrednimi odniesieniami z obszaru pamięci.
- Inicjalizacja: Jest to końcowa część ClassLoadera. Oryginalne wartości są przypisywane do wszystkich zmiennych statycznych, po czym następuje wykonanie bloku statycznego. Ta część jest wykonywana od góry do dołu klasy.
Sterta
Szczegóły dotyczące zmiennych obiektu i instancji są tutaj przechowywane. Jest to obszar pamięci współdzielonej, co oznacza, że przechowywane tutaj dane nie są bezpieczne dla wątków.
Wyjątek w wątku „main” java.lang.OutOfMemoryError: Przestrzeń sterty Java
Jednym z najbardziej powiązanych błędów jest wyjątek „OutOfMemoryError ”, co oznacza, że JVM nie może przydzielić obiektu w obszarze sterty lub nie można wykonać przydziału pamięci dla tego samego obiektu.
Stos
To tutaj tworzony jest osobny stos środowiska wykonawczego dla każdego nowego wątku. Znany również jako stos wykonawczy, za każdym razem, gdy wywoływana jest metoda, wszystkie szczegóły są przechowywane w odpowiednim stojaku wykonawczym, a po zakończeniu metody szczegóły te są usuwane ze stosu.
Rejestry komputerowe
Dla każdego wątku tworzony jest osobny rejestr PC (licznik programów), który przechowuje adres bieżącej instrukcji wykonania, która później zostanie zaktualizowana o następną instrukcję. Ten obszar pamięci jest dość mały i ma stały rozmiar.
Stos metod natywnych
Jest to jeden z własnych obszarów pamięci, które są wywoływane przez wątek, a następnie wątek znajduje się na zupełnie nowym poziomie, gdzie struktura i ograniczenia bezpieczeństwa wynikające z wirtualnej maszyny Java nie są już stosowane. W porównaniu do innych obszarów pamięci wykonawczej pamięć zajmowana przez stosy metod natywnych nie ma ustalonego rozmiaru, bez ograniczeń w zakresie zwiększania lub zmniejszania.
Java Native Interface
JNI po prostu współdziała z niżej wymienionymi natywnymi bibliotekami metod, które są w implementacji C, C ++ i zapewniają to samo silnikowi wykonawczemu. Bezpośredni dostęp do kodu asemblera jest dozwolony przez JNI. W JVM Java i Native to dwa typy kodów. JNI płynnie ustanawia dobrze zdefiniowane powiązanie między nimi.
Biblioteki metod natywnych
Kolekcja bibliotek natywnych, zgodnie z wymaganiami mechanizmu wykonywania.
Silnik wykonania
Cóż, teraz mamy program Java do kodu bajtowego, który jest przypisywany do wyżej objaśnionych obszarów danych za pomocą modułu ładującego klasy, a teraz kod bajtowy zostanie wykonany przez silnik wykonawczy. Mechanizm wykonawczy po prostu odczytuje kod bajtowy w jednostkach, jak maszyna odczytująca kolejno linie kodu. Kod bajtowy jest formatem czytelnym dla człowieka, dlatego maszyna nie może go odczytać i musi zostać przekonwertowany na format czytelny dla komputera, w którym do interpretacji wykorzystywane są poniższe komponenty.
Silnik wykonawczy składa się z trzech głównych komponentów, którymi są interpreter, kompilator JIT i moduł wyrzucania śmieci.
1. Tłumacz ustny
Po prostu wykonuje kod bajtowy metodą sekwencyjną. Wywołanie jest wykonywane przez zapytanie wiersza polecenia ze skompilowanym plikiem jako argumentem. Interpreter dość szybko interpretuje i wykonuje polecenia jeden po drugim, co dzieje się szybciej niż kompilator JIT w celu skompilowania kodu.
nazwa klasy java
Klasa main () musi znajdować się w skompilowanym pliku .class.
2. Kompilator JIT
Jeden z najważniejszych składników Java Runtime Environment, który poprawia wydajność aplikacji Java w czasie wykonywania. Żaden inny składnik nie ma większego wpływu na wydajność niż kompilator JIT. Jest to domyślny kompilator, który jest aktywowany po wywołaniu dowolnej metody Java.
3. Garbage Collector
Jak sama nazwa wskazuje, ma to coś wspólnego ze śmieciami, Garbage Collector po prostu wyszukuje każdy możliwy obiekt dostępny w przestrzeni sterty JVM, sprawdza, czy jest on używany, a następnie usuwa nieużywane. Oznacza to po prostu fragmenty pamięci, które są w użyciu lub nie. Następnie kontynuuje zamiatanie, gdzie po prostu usuwa zaznaczony obiekt. Najlepszym przypadkiem użycia jest to, że nie jest potrzebny ręczny system alokacji pamięci, ponieważ Garbage Collector automatycznie usuwa nieużywane miejsce w pamięci. Ponieważ jednak jest to zadanie automatyczne, żaden programista nie ma kontroli nad planowaniem żadnego przedziału czasowego dla konkretnego zadania czyszczenia i nie wymaga większej mocy procesora podczas wyszukiwania odniesień do obiektu.
Wniosek
Chociaż zrozumienie tego, jak działa JVM, nie jest obowiązkowe, do pisania kodu Java jest jednak niezwykle pomocne. Deweloper, który rozumie działanie JVM, napisze lepszy i zoptymalizowany kod, bez względu na to, jak długie lub złożone jest to wymaganie. Oprócz podanego tutaj opisu JVM zapewnia szeroki zakres funkcji i technologii. Tych funkcji można użyć, aby poprawić wydajność zgodnie z potrzebami określonego dostawcy
Polecane artykuły
To jest przewodnik po wirtualnej maszynie Java. Tutaj omawiamy architekturę wirtualnej maszyny Java wraz z jej różnymi komponentami. Możesz także przejrzeć następujące artykuły, aby dowiedzieć się więcej -
- Sortowanie bąbelkowe w JavaScript
- Cykl życia wątku w Javie
- Co to jest Java SE?
- Najlepsze kompilatory Java
- JRE vs JVM | 8 najważniejszych różnic z (Infografika)