Co to jest JVM? Wprowadzenie do wirtualnej maszyny języka Java

Java Virtual Machine to program, którego celem jest wykonywanie innych programów. To prosty pomysł, który jest również jednym z naszych najlepszych przykładów kodowania kung fu . JVM naruszyło dotychczasowe status quo i nadal wspiera innowacje programistyczne.

Do czego służy maszyna JVM

Maszyna JVM ma dwie podstawowe funkcje: umożliwia uruchamianie programów Java na dowolnym urządzeniu lub systemie operacyjnym (tzw. Zasada „Jednokrotne zapisywanie, uruchamianie w dowolnym miejscu”) oraz zarządzanie i optymalizowanie pamięci programów. Kiedy Java została wydana w 1995 roku, wszystkie programy komputerowe były napisane w określonym systemie operacyjnym, a pamięć programu była zarządzana przez programistę. Więc JVM było objawieniem.

JavaWorld /

Posiadanie technicznej definicji maszyny JVM jest przydatne, a programiści oprogramowania na co dzień o tym myślą. Podzielmy je:

  • Definicja techniczna : JVM to specyfikacja programu, który wykonuje kod i zapewnia środowisko wykonawcze dla tego kodu.
  • Definicja na co dzień : JVM to sposób, w jaki uruchamiamy nasze programy Java. Konfigurujemy ustawienia maszyny JVM, a następnie polegamy na niej w zarządzaniu zasobami programu podczas wykonywania.

Kiedy programiści mówią o JVM, zwykle mamy na myśli proces działający na maszynie, zwłaszcza na serwerze, który reprezentuje i kontroluje wykorzystanie zasobów dla aplikacji Java. Porównaj to ze specyfikacją JVM , która opisuje wymagania dotyczące tworzenia programu wykonującego te zadania.

Kto opracowuje i utrzymuje JVM?

JVM jest szeroko rozpowszechniony, intensywnie używany i utrzymywany przez bardzo bystrych programistów, zarówno korporacyjnych, jak i open source. Projekt OpenJDK jest następstwem decyzji firmy Sun Microsystems o wprowadzeniu Javy o otwartym kodzie źródłowym. OpenJDK był kontynuowany dzięki zarządzaniu Javą przez Oracle, przy czym większość ciężkich prac wykonywanych obecnie przez inżynierów Oracle.

Zarządzanie pamięcią w JVM

Najczęstszą interakcją z uruchomioną maszyną JVM jest sprawdzenie użycia pamięci w stercie i stosie. Najpowszechniejszą regulacją jest dostrojenie ustawień pamięci maszyny JVM.

Zbieranie śmieci

Przed Java cała pamięć programu była zarządzana przez programistę. W Javie pamięć programu jest zarządzana przez JVM. JVM zarządza pamięcią poprzez proces zwany czyszczeniem pamięci , który w sposób ciągły identyfikuje i eliminuje nieużywaną pamięć w programach Java. Wyrzucanie elementów bezużytecznych odbywa się wewnątrz uruchomionej maszyny JVM.

Na początku Java spotkała się z dużą krytyką za to, że nie jest tak „blisko metalu” jak C ++, a zatem nie jest tak szybka. Szczególnie kontrowersyjny był proces zbierania śmieci. Od tego czasu wiele algorytmów i podejść zostało zaproponowanych i wykorzystanych do czyszczenia pamięci. Dzięki konsekwentnemu rozwojowi i optymalizacji system usuwania elementów bezużytecznych znacznie się poprawił.

Co oznacza „blisko metalu”?

Kiedy programiści mówią, że język programowania lub platforma są „bliskie metalowi”, mamy na myśli to, że programista jest w stanie programowo (pisząc kod) zarządzać pamięcią systemu operacyjnego. Teoretycznie programiści mogą wycisnąć więcej wydajności z naszych programów, określając, ile jest używane i kiedy je odrzucić. W większości przypadków delegowanie zarządzania pamięcią do wysoce wyrafinowanego procesu, takiego jak JVM, daje lepszą wydajność i mniej błędów niż wykonanie tego samodzielnie.

JVM w trzech częściach

Można powiedzieć, że istnieją trzy aspekty JVM: specyfikacja, implementacja i instancja. Rozważmy każdy z nich.

1. Specyfikacja JVM

Po pierwsze, JVM to specyfikacja oprogramowania. W nieco okrężny sposób specyfikacja JVM podkreśla, że ​​szczegóły jej implementacji nie są zdefiniowane w specyfikacji, aby umożliwić maksymalną kreatywność w jej realizacji:

„Aby poprawnie zaimplementować wirtualną maszynę Java, wystarczy mieć możliwość odczytania classformatu pliku i poprawnego wykonania określonych w nim operacji”.

JS Bach opisał kiedyś tworzenie muzyki podobnie:

„Wszystko, co musisz zrobić, to dotknąć odpowiedniego klawisza we właściwym czasie”.

Zatem wszystko, co JVM musi zrobić, to poprawnie uruchamiać programy Java. Brzmi prosto, może nawet wyglądać prosto z zewnątrz, ale jest to ogromne przedsięwzięcie, zwłaszcza biorąc pod uwagę moc i elastyczność języka Java.

JVM jako maszyna wirtualna

JVM to maszyna wirtualna, która w przenośny sposób uruchamia pliki klas Java. Bycie maszyną wirtualną oznacza, że ​​JVM jest abstrakcją bazowej, rzeczywistej maszyny - takiej jak serwer, na którym działa program. Niezależnie od tego, jaki system operacyjny lub sprzęt jest faktycznie obecny, maszyna JVM tworzy przewidywalne środowisko, w którym mogą działać programy. Jednak w przeciwieństwie do prawdziwej maszyny wirtualnej JVM nie tworzy wirtualnego systemu operacyjnego. Bardziej dokładne byłoby opisanie maszyny JVM jako zarządzanego środowiska wykonawczego lub maszyny wirtualnej procesu .

2. Implementacje JVM

Implementacja specyfikacji JVM skutkuje powstaniem rzeczywistego programu, który jest implementacją JVM. W rzeczywistości istnieje wiele implementacji JVM, zarówno otwartych, jak i zastrzeżonych. OpenJDK HotSpot JVM jest implementacją referencyjną i pozostaje jedną z najlepiej wypróbowanych i przetestowanych baz kodu na świecie. HotSpot jest również najczęściej używaną maszyną JVM.

Prawie wszystkie licencjonowane maszyny JVM są tworzone jako rozwidlenia OpenJDK i HotSpot JVM, w tym licencjonowany JDK firmy Oracle. Programiści tworzący licencjonowany rozwidlenie z OpenJDK często są motywowani chęcią dodania ulepszeń wydajności specyficznych dla systemu operacyjnego. Zwykle należy pobrać i zainstalować maszynę JVM jako dołączoną część środowiska Java Runtime Environment (JRE).

3. Instancja maszyny JVM

Po zaimplementowaniu specyfikacji maszyny JVM i opublikowaniu jej jako oprogramowania, można ją pobrać i uruchomić jako program. Ten pobrany program jest instancją (lub wersją, na którą utworzono instancję) maszyny JVM.

W większości przypadków, gdy programiści mówią o „JVM”, mamy na myśli instancję JVM działającą w środowisku programistycznym lub produkcyjnym. Możesz powiedzieć: „Hej Anand, ile pamięci używa JVM na tym serwerze?” lub „Nie mogę uwierzyć, że utworzyłem wywołanie cykliczne i błąd przepełnienia stosu spowodował awarię mojej maszyny JVM. Co za błąd początkującego!”

Co to jest specyfikacja oprogramowania?

Specyfikacja oprogramowania (lub specyfikacja) to czytelny dla człowieka dokument projektowy, który opisuje, jak powinien działać system oprogramowania. Celem specyfikacji jest stworzenie jasnego opisu i wymagań dla inżynierów do kodowania.

Ładowanie i wykonywanie plików klas w JVM

Rozmawialiśmy o roli maszyny JVM w uruchamianiu aplikacji Java, ale jak spełnia ona swoją funkcję? Aby móc uruchamiać aplikacje Java, maszyna JVM jest zależna od programu ładującego klasy Java i silnika wykonywania języka Java.

Moduł ładujący klasy Java w maszynie JVM

Wszystko w Javie jest klasą, a wszystkie aplikacje Java są zbudowane z klas. Aplikacja może składać się z jednej klasy lub tysięcy. Aby uruchomić aplikację Java, JVM musi załadować skompilowane pliki .class do kontekstu, takiego jak serwer, gdzie można uzyskać do nich dostęp. Aby wykonać tę funkcję, maszyna JVM jest zależna od programu ładującego klasy.

Moduł ładujący klasy Java to część maszyny JVM, która ładuje klasy do pamięci i udostępnia je do wykonania. Programy ładujące klasy używają technik takich jak leniwe ładowanie i buforowanie, aby ładowanie klas było tak wydajne, jak to tylko możliwe. To powiedziawszy, ładowanie klas nie jest epicką łamigłówką, którą (powiedzmy) jest zarządzanie pamięcią przenośną, więc techniki są stosunkowo proste.

Każda wirtualna maszyna języka Java zawiera moduł ładujący klasy. Specyfikacja JVM opisuje standardowe metody wykonywania zapytań i manipulowania programem ładującym klasy w czasie wykonywania, ale implementacje JVM są odpowiedzialne za wypełnienie tych możliwości. Z punktu widzenia programisty, podstawowe mechanizmy ładowania klas to zazwyczaj czarna skrzynka.

Silnik wykonawczy w JVM

Gdy program ładujący klasy zakończy pracę polegającą na ładowaniu klas, maszyna JVM rozpocznie wykonywanie kodu w każdej klasie. Mechanizm wykonawczy to komponent JVM, który obsługuje tę funkcję. Silnik wykonawczy ma zasadnicze znaczenie dla działającej maszyny JVM. W rzeczywistości jest to instancja JVM.

Wykonywanie kodu obejmuje zarządzanie dostępem do zasobów systemowych. Silnik wykonawczy maszyny JVM znajduje się pomiędzy uruchomionym programem - z jego żądaniami dotyczącymi zasobów plików, sieci i pamięci - a systemem operacyjnym, który dostarcza te zasoby.

Jak mechanizm wykonawczy zarządza zasobami systemowymi

Zasoby systemowe można podzielić na dwie szerokie kategorie: pamięć i wszystko inne.

Przypomnijmy, że maszyna JVM jest odpowiedzialna za usuwanie nieużywanej pamięci, a czyszczenie pamięci jest mechanizmem, który to usuwa. JVM jest również odpowiedzialna za przydzielanie i utrzymywanie struktury referencyjnej, którą programista przyjmuje za pewnik. Na przykład silnik wykonawczy maszyny JVM jest odpowiedzialny za pobranie czegoś podobnego do newsłowa kluczowego w Javie i przekształcenie go w specyficzne dla systemu operacyjnego żądanie alokacji pamięci.

Poza pamięcią, silnik wykonawczy zarządza zasobami dostępu do systemu plików i we / wy sieci. Ponieważ maszyna JVM jest kompatybilna z różnymi systemami operacyjnymi, nie jest to łatwe zadanie. Oprócz zapotrzebowania na zasoby każdej aplikacji, silnik wykonawczy musi reagować na każde środowisko systemu operacyjnego. W ten sposób JVM jest w stanie sprostać dzikim żądaniom.

Ewolucja JVM: przeszłość, teraźniejszość, przyszłość

W 1995 roku JVM wprowadziła dwie rewolucyjne koncepcje, które od tamtego czasu stały się standardem dla nowoczesnego oprogramowania: „Napisz raz, uruchom w dowolnym miejscu” i automatyczne zarządzanie pamięcią. Współdziałanie oprogramowania było wówczas odważną koncepcją, ale niewielu programistów dzisiaj by się nad tym zastanowić. Podobnie, podczas gdy nasi przodkowie w dziedzinie inżynierii musieli sami zarządzać pamięcią programów, moje pokolenie dorastało ze zbieraniem śmieci.

Można powiedzieć, że James Gosling i Brendan Eich wymyślili nowoczesne programowanie, ale tysiące innych osób dopracowało i rozwinęło swoje pomysły w następnych dziesięcioleciach. Podczas gdy Java Virtual Machine była pierwotnie przeznaczona tylko dla Javy, dziś ewoluowała, aby obsługiwać wiele języków skryptowych i programowania, w tym Scala, Groovy i Kotlin. Patrząc w przyszłość, trudno jest przewidzieć przyszłość, w której JVM nie będzie znaczącą częścią krajobrazu rozwoju.

Wszystko o JVM

  • Zawodnicy Java: zachowanie wątków w maszynie JVM
  • Programiści Java: Przeciążanie metod w JVM
  • Optymalizacja wydajności wewnątrz maszyny JVM
  • Podstawy kodu bajtowego: jak maszyna JVM obsługuje kod bajtowy
  • Wyjątki Java: jak maszyna JVM obsługuje wyjątki
  • Przedstawiamy oszczędną, wredną wirtualną maszynę Java

Artykuł „Co to jest JVM? Wprowadzenie do wirtualnej maszyny języka Java” został pierwotnie opublikowany przez JavaWorld.