Obecnie monitoruję aplikację Java za pomocą jconsole. Karta pamięci pozwala wybrać między:
Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”
Jaka jest różnica między nimi ?
Odpowiedzi:
Pamięć stert
Pamięć sterty jest obszarem danych wykonawczych, z którego maszyna wirtualna Java przydziela pamięć dla wszystkich instancji klas i tablic. Sterty mogą mieć stały lub zmienny rozmiar. Garbage collector to automatyczny system zarządzania pamięcią, który odzyskuje pamięć sterty dla obiektów.
Eden Space : pula, z której początkowo przydzielana jest pamięć dla większości obiektów.
Survivor Space : kałuża zawierająca przedmioty, które przetrwały zbiór śmieci w przestrzeni Eden.
Tenured Generation lub Old Gen : pula zawierająca obiekty, które istniały przez pewien czas w przestrzeni ocalałych.
Pamięć bez stosu
Pamięć bez stosu obejmuje obszar metody współużytkowany przez wszystkie wątki i pamięć wymaganą do wewnętrznego przetwarzania lub optymalizacji maszyny wirtualnej Java. Przechowuje struktury dla poszczególnych klas, takie jak pula stałych środowiska wykonawczego, dane pól i metod oraz kod metod i konstruktorów. Obszar metody jest logicznie częścią sterty, ale w zależności od implementacji wirtualna maszyna Java nie może go wyrzucać do pamięci ani go kompaktować. Podobnie jak pamięć sterty, obszar metody może mieć stały lub zmienny rozmiar. Pamięć obszaru metody nie musi być ciągła.
Permanent Generation : pula zawierająca wszystkie dane odblaskowe samej maszyny wirtualnej, takie jak obiekty klasy i metody. W przypadku maszyn wirtualnych Java, które korzystają z udostępniania danych klasy, ta generacja jest podzielona na obszary tylko do odczytu i do odczytu i zapisu.
Pamięć podręczna kodu : maszyna wirtualna Java HotSpot zawiera również pamięć podręczną kodu, zawierającą pamięć używaną do kompilacji i przechowywania natywnego kodu.
Oto dokumentacja na temat korzystania z Jconsole .
źródło
Nowe słowo kluczowe przydziela pamięć na stercie Java. Sterta jest główną pulą pamięci, dostępną dla całej aplikacji. Jeśli nie ma wystarczającej ilości pamięci do przydzielenia dla tego obiektu, JVM próbuje odzyskać część pamięci ze sterty przy użyciu funkcji wyrzucania elementów bezużytecznych. Jeśli nadal nie można uzyskać wystarczającej ilości pamięci, zgłaszany jest błąd OutOfMemoryError i JVM kończy pracę.
Kupa jest podzielona na kilka różnych sekcji, zwanych pokoleniami. Ponieważ obiekty przeżywają więcej śmieci, są one promowane do różnych generacji. Starsze pokolenia nie są tak często zbierane. Ponieważ przedmioty te okazały się już dłużej żywe, rzadziej są one zbierane w śmieciach.
Kiedy obiekty są budowane po raz pierwszy, są one przydzielane w przestrzeni Eden. Jeśli przeżyją zbiórkę śmieci, awansują do Przestrzeni Ocalałych, a jeśli tam żyją wystarczająco długo, zostają przydzieleni do Generacji Wytrzymałości. To pokolenie śmieci są zbierane znacznie rzadziej.
Istnieje również czwarta generacja, zwana Permanent Generation lub PermGen. Obiekty znajdujące się tutaj nie kwalifikują się do odśmiecania i zwykle zawierają niezmienny stan niezbędny do uruchomienia JVM, taki jak definicje klas i pula stała String. Zauważ, że przestrzeń PermGen jest planowana do usunięcia z Java 8 i zostanie zastąpiona nową przestrzenią o nazwie Metaspace, która będzie przechowywana w pamięci natywnej. odniesienie :http://www.programcreek.com/2013/04/jvm-run-time-data-areas/
źródło
-XX:PermSize
a nie-XX:MaxPermSize
jak już zdefiniowano powyżej.W Javie region bez stosu nie zawiera już PermGen, ale Metaspace, co jest poważną zmianą w Javie 8, która ma pozbyć się błędów pamięci w java, ponieważ rozmiar metaspace może zostać zwiększony w zależności od miejsca wymaganego przez Jvm na dane klasy.
źródło
Java Heap Memory jest częścią pamięci przydzielonej JVM przez system operacyjny.
Obiekty znajdują się w obszarze zwanym stertą. Sterta jest tworzona podczas uruchamiania JVM i może zwiększać lub zmniejszać rozmiar podczas działania aplikacji. Kiedy sterty zostaną zapełnione, śmieci są zbierane.
Więcej informacji na temat Eden Space, Survivor Space, Tenured Space i Permanent Generation znajduje się w poniższym pytaniu SE:
Generacja młodych, pełnoletnich i stałych
PermGen został zastąpiony Metaspace od wydania Java 8.
Odnośnie twoich zapytań:
Codecache: Java Virtual Machine (JVM) generuje kod macierzysty i przechowuje go w obszarze pamięci zwanym codecache. JVM generuje kod macierzysty z różnych powodów, w tym dla dynamicznie generowanej pętli interpretera, kodów pośredniczących Java Native Interface (JNI) oraz metod Java, które są kompilowane do kodu macierzystego przez kompilator just-in-time (JIT). JIT jest zdecydowanie największym użytkownikiem pamięci podręcznej.
źródło