Jak dzieli się pulę pamięci java?

Obecnie monitoruję aplikację Java za pomocą jconsole. Karta memory pozwala wybrać pomię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 ?
Author: assylias, 2009-08-11

4 answers

Pamięć sterty

Pamięć sterty jest obszarem danych uruchomieniowych, z którego maszyna wirtualna Java przydziela pamięć dla wszystkich instancji klas i tablic. Sterta może mieć stały lub zmienny rozmiar. Garbage collector jest automatycznym systemem zarządzania pamięcią, który odzyskuje pamięć sterty obiektów.

  • Eden Space : Pula, z której początkowo przydzielana jest pamięć dla większości obiektów.

  • Survivor Space : basen zawierający obiekty, które mają / align = "left" /

  • Tenured Generation lub Old Gen : Pula zawierająca przedmioty, które istnieją od pewnego czasu w przestrzeni ocalałych.

Pamięć bez sterty

Non-heap memory zawiera obszar metod współdzielony przez wszystkie wątki oraz pamięć wymaganą do wewnętrznego przetwarzania lub optymalizacji maszyny wirtualnej Java. Przechowuje struktury poszczególnych klas, takie jak stała Pula uruchomieniowa, dane pól i metod oraz kod dla metod i konstruktorów. Obszar metod jest logicznie częścią sterty, ale, w zależności od implementacji, maszyna wirtualna Java nie może zbierać śmieci ani kompaktować jej. Podobnie jak pamięć sterty, obszar metody może mieć stały lub zmienny rozmiar. Pamięć obszaru metody nie musi być przylegająca.

  • Permanent Generation: Pula zawierająca wszystkie dane odblaskowe samej maszyny wirtualnej, takie jak obiekty klas i metod. Z maszynami wirtualnymi Java używającymi klasy udostępnianie danych, generacja ta jest podzielona na obszary tylko do odczytu i do odczytu i zapisu.

  • Pamięć podręczna kodu : hotspot Java VM zawiera również pamięć podręczną kodu, zawierającą pamięć używaną do kompilacji i przechowywania kodu natywnego.

Oto dokumentacja jak używać Jconsole .

 295
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-03 17:13:56

Nowe słowo kluczowe przydziela pamięć na stercie Javy. 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 za pomocą garbage collection. Jeśli nadal nie może uzyskać wystarczającej ilości pamięci, zostanie wyrzucony OutOfMemoryError, a JVM zakończy działanie.

Sterta jest podzielona na kilka różnych sekcji, zwanych generacjami. Jak obiekty przetrwać więcej śmieci kolekcje, są one promowane w różnych pokoleniach. Starsze pokolenia nie są śmieciami zbieranymi tak często. Ponieważ obiekty te dowiodły już dłuższego życia, są one mniej podatne na zbieranie śmieci.

Kiedy obiekty są konstruowane po raz pierwszy, są przydzielane w przestrzeni Edenu. Jeśli przetrwają zbiórkę śmieci, awansują na miejsce ocalałych, a jeśli żyją wystarczająco długo, są przydzielane do pokolenia najemnego. To pokolenie to śmieci zbierane znacznie rzadziej.

Istnieje również czwarte pokolenie, zwane permanent Generation, czyli PermGen. Obiekty, które się tu znajdują, Nie kwalifikują się do usunięcia śmieci i zazwyczaj zawierają niezmienny stan niezbędny do uruchomienia JVM, taki jak definicje klas i stała Pula łańcuchów. Należy pamiętać, że przestrzeń PermGen zostanie usunięta z Java 8 i zostanie zastąpiona nową przestrzenią o nazwie Metaspace, która będzie przechowywana w języku natywnym pamięć. reference: http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

Tutaj wpisz opis obrazka Tutaj wpisz opis obrazka

 49
Author: Pythoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-08 17:19:31

W Java8, non heap region no more zawiera PermGen, ale Metaspace, co jest główną zmianą w Java8, która ma pozbyć się błędów pamięci z java, Ponieważ rozmiar metaspace może być zwiększony w zależności od miejsca wymaganego przez jvm dla danych klasowych.

 31
Author: user2767149,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-18 05:30:03

Java Heap Memory jest częścią pamięci przydzielonej do JVM przez System operacyjny.

Obiekty znajdują się w obszarze zwanym stertą. Sterta jest tworzona podczas uruchamiania JVM i może zwiększyć lub zmniejszyć rozmiar podczas uruchamiania aplikacji. Kiedy sterta staje się pełna, śmieci są zbierane.

Tutaj wpisz opis obrazka

Więcej szczegółów na tematEden Space, Survivor Space, Tenured Space i Permanent Generation znajdziesz poniżej:

Young , Etat i Perm generation

PermGen został zastąpiony przez Metaspace od wydania Java 8.

Odnośnie Twoich zapytań:

  1. przestrzeń Eden, przestrzeń ocalała, przestrzeń ta jest częścią pamięci sterty
  2. Metaspace i cache kodu są częścią pamięci non-heap.

Codecache: wirtualna maszyna Javy (JVM) generuje kod macierzysty i przechowuje go w obszarze pamięci o nazwie codecache. JVM generuje natywny kod z różnych powodów, w tym dla dynamicznie generowanej pętli interpretera, stubów Java Native Interface (JNI) oraz dla metod Java, które są kompilowane do kodu natywnego przez kompilator just-In-time (JIT). JIT jest zdecydowanie największym użytkownikiem codecache.

 14
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:10