Wirtualna maszyna Java - obszary danych środowiska wykonawczego

Specyfikacja JVM definiuje pewne obszary danych czasu wykonywania, które są potrzebne podczas wykonywania programu. Niektóre z nich są tworzone podczas uruchamiania maszyny JVM. Inne są lokalne dla wątków i są tworzone tylko podczas tworzenia wątku (i niszczone, gdy wątek jest niszczony). Są one wymienione poniżej -

Rejestr PC (licznik programów)

Jest lokalna dla każdego wątku i zawiera adres instrukcji JVM, którą wątek aktualnie wykonuje.

Stos

Jest lokalna dla każdego wątku i przechowuje parametry, zmienne lokalne i adresy zwrotne podczas wywołań metod. Błąd StackOverflow może wystąpić, jeśli wątek wymaga więcej miejsca na stosie niż jest to dozwolone. Jeśli stos jest rozszerzalny dynamicznie, nadal może generować OutOfMemoryError.

Sterta

Jest współdzielony przez wszystkie wątki i zawiera obiekty, metadane klas, tablice itp., Które są tworzone w czasie wykonywania. Jest tworzony podczas uruchamiania maszyny JVM i niszczony, gdy JVM zostaje zamknięty. Możesz kontrolować ilość sterty żądań maszyny JVM od systemu operacyjnego za pomocą określonych flag (więcej na ten temat później). Należy uważać, aby nie wymagać zbyt małej lub zbyt dużej ilości pamięci, ponieważ ma to ważne konsekwencje dla wydajności. Co więcej, GC zarządza tą przestrzenią i stale usuwa martwe obiekty, aby zwolnić przestrzeń.

Obszar metody

Ten obszar wykonawczy jest wspólny dla wszystkich wątków i jest tworzony podczas uruchamiania maszyny JVM. Przechowuje struktury klas, takie jak pula stałych (więcej na ten temat później), kod konstruktorów i metod, dane metod, itp. JLS nie określa, czy ten obszar ma zostać usunięty, a zatem implementacje metody JVM może zignorować GC. Ponadto może się to rozszerzyć lub nie zgodnie z potrzebami aplikacji. JLS nie upoważnia niczego w tym zakresie.

Pula stałych czasu wykonywania

JVM utrzymuje strukturę danych na klasę / typ, która działa jak tabela symboli (jedna z jej wielu ról) podczas łączenia załadowanych klas.

Natywne stosy metod

Gdy wątek wywołuje metodę natywną, wkracza w nowy świat, w którym struktury i ograniczenia bezpieczeństwa wirtualnej maszyny Java nie ograniczają już jej wolności. Metoda natywna może prawdopodobnie uzyskać dostęp do obszarów danych środowiska wykonawczego maszyny wirtualnej (zależy to od interfejsu metody natywnej), ale może również zrobić wszystko, co tylko zechce.

Zbieranie śmieci

JVM zarządza całym cyklem życia obiektów w Javie. Po utworzeniu obiektu deweloper nie musi się już o to martwić. W przypadku, gdy obiekt staje się martwy (to znaczy nie ma już do niego odniesienia), jest wyrzucany ze stosu przez GC za pomocą jednego z wielu algorytmów - szeregowego GC, CMS, G1 itp.

Podczas procesu GC obiekty są przenoszone w pamięci. Dlatego te obiekty nie nadają się do użytku w trakcie procesu. Cała aplikacja musi zostać zatrzymana na czas trwania procesu. Takie przerwy nazywane są przerwami typu „stop-the-world” i stanowią ogromne obciążenie. Algorytmy GC mają na celu przede wszystkim skrócenie tego czasu. Omówimy to szczegółowo w następnych rozdziałach.

Dzięki GC wycieki pamięci są bardzo rzadkie w Javie, ale mogą się zdarzyć. W dalszych rozdziałach zobaczymy, jak stworzyć wyciek pamięci w Javie.