Terminologia stosu Java: młode, stare i stałe pokolenia?

318

Próbuję zrozumieć, jakie są pojęcia młodych , starych i stałych pokoleń w terminologii stosu Java, a dokładniej interakcji między trzema pokoleniami.

Moje pytania to:

  • Jakie jest młode pokolenie?
  • Jakie jest stare pokolenie?
  • Co to jest stałe pokolenie?
  • W jaki sposób trzy pokolenia oddziałują na siebie?
knorv
źródło
Zakładając, że mówisz o Sun JDK / OpenJDK, zobacz stronę w witrynie OpenJDK na temat zarządzania pamięcią masową . Na dole znajduje się kilka linków do jeszcze więcej informacji.
Nicholas Riley
1
również związane z tym pytaniem „generacja generowana”
gstackoverflow

Odpowiedzi:

304

To wydaje się być powszechnym nieporozumieniem. W JVM firmy Oracle stałe generowanie nie jest częścią stosu. To oddzielna przestrzeń dla definicji klas i powiązanych danych. W Javie 6 i wcześniejszych internowane łańcuchy były również przechowywane w stałej generacji. W Javie 7 wewnętrzne ciągi są przechowywane w stercie obiektów głównych.

Oto dobry post na temat stałego generowania .

Podobają mi się opisy podane dla każdego miejsca w przewodniku Oracle na temat JConsole :

W przypadku maszyny Wirtualnej HotSpot Java pule pamięci dla szeregowego czyszczenia pamięci są następujące.

  • Eden Space (sterta): pula, z której początkowo przydzielana jest pamięć dla większości obiektów.
  • Survivor Space (kupa): Pula zawierająca przedmioty, które przetrwały zbiórkę śmieci w przestrzeni Eden.
  • Tenured Generation (sterta): pula zawierająca obiekty, które istniały przez pewien czas w przestrzeni ocalałych.
  • Permanent Generation (non-heap): 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 (bez stosu): maszyna wirtualna Java HotSpot zawiera również pamięć podręczną kodu, zawierającą pamięć używaną do kompilacji i przechowywania kodu natywnego.

Java wykorzystuje generacyjne odśmiecanie pamięci. Oznacza to, że jeśli masz obiekt foo (który jest instancją jakiejś klasy), im więcej zdarzeń związanych z odśmiecaniem przeżyje (jeśli nadal istnieją odniesienia do niego), tym bardziej będzie on promowany. Zaczyna się w młodym pokoleniu (które samo jest podzielone na wiele przestrzeni - Eden i Survivor) i ostatecznie skończy w pokoleniu, jeśli przetrwa wystarczająco długo.

Joshua McKinnon
źródło
2
Wierzę, że od Java 7 ciągi nie są już internowane w stałym generowaniu.
Tim Goodman,
Masz rację, jestem zaskoczony, że to przetrwało na długo przed wzmianką. Następnie w Javie 8 stałe generowanie zostanie zastąpione przez metaspace (chociaż nie jestem pewien, jak naprawdę będzie to inne, poza domyślnym nieograniczeniem)
Joshua McKinnon
9
Joshua - czy „stary” jest synonimem „wytrwałości”, a „nowy” jest synonimem „ocalałego”?
joadha
1
perm gen ma zastosowanie tylko przed
wersją
2
Jeśli nadal czekasz na odpowiedź, tak, masz rację @joadha. Sprawdź ten link: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc
197

Stos jest podzielony na młode i stare pokolenia w następujący sposób:

Young Generation : To miejsce, w którym mieszkał przez krótki okres i podzielony na dwie przestrzenie:

  • Eden Space : Gdy obiekt został utworzony przy użyciu nowej pamięci słów kluczowych przydzielonej do tego miejsca.
  • Survivor Space : jest to pula, która zawiera obiekty, które przetrwały po zbiorze śmieci java z przestrzeni Eden.

Stara generacja : ta pula zasadniczo zawiera przestrzeń dzierżawioną i wirtualną (zarezerwowaną) i pomieści obiekty, które przetrwały po wyrzuceniu elementów bezużytecznych od Young Generation.

  • Przestrzeń dzierżawiona: ta pula pamięci zawiera obiekty, które przetrwały po wielokrotnym wyrzucaniu elementów bezużytecznych, oznaczają obiekty, które przetrwały po wyrzuceniu elementów bezużytecznych z przestrzeni Ocalonego .

Permanent Generation: Ta pula pamięci, jak sama nazwa wskazuje, zawiera również trwałe metadane klasy i informacje o deskryptorach, więc przestrzeń PermGen jest zawsze zarezerwowana dla klas i tych, które są powiązane z klasami, na przykład członków statycznych.

Aktualizacja Java8: PermGen został zastąpiony przez Metaspace, który jest bardzo podobny.
Główną różnicą jest to, że Metaspace zmienia rozmiar dynamicznie, tj. Może się rozszerzać w czasie wykonywania.
Przestrzeń Java Metaspace: bez ograniczeń (domyślnie)

Pamięć podręczna kodu (wirtualna lub zarezerwowana): jeśli używasz maszyny wirtualnej Java HotSpot, obejmuje to obszar pamięci podręcznej kodu zawierający pamięć, która zostanie użyta do kompilacji i przechowywania kodu natywnego.

wprowadź opis zdjęcia tutaj

Kurtuazja

Premraj
źródło
@Premraj, co to znaczy Metaspace zmienia rozmiar dynamicznie, tzn. Może się rozszerzać w czasie wykonywania. ? Jedyną różnicą, że domyślnie nie ma granicy?
gstackoverflow
1
doskonale .. czy mogę wiedzieć, gdzie na tym obrazku znajduje się obszar metody, natywna paczka i stała pula uruchomieniowa? i co odpowiednio trzymają?
jeśli pamięć podręczna kodu jest używana dla kodu metody natywnej, co będzie miał stos metody natywnej (każdy wątek będzie miał jeden)?
49

Jakie jest młode pokolenie?

Młode pokolenie jest, gdy wszystkie nowe obiekty są przydzielane i wieku. Gdy młode pokolenie się zapełnia, powoduje to niewielkie zbieranie śmieci. Młode pokolenie pełne martwych przedmiotów zbiera się bardzo szybko. Niektóre ocalałe przedmioty są starzone i ostatecznie przenoszą się do starego pokolenia.

Jakie jest stare pokolenie?

Old Generation służy do przechowywania długo ocalałych obiektów. Zazwyczaj próg jest ustawiany dla obiektu młodego pokolenia, a gdy ten wiek zostanie osiągnięty, obiekt zostaje przeniesiony do starego pokolenia. Ostatecznie należy zebrać starą generację. To wydarzenie nazywa się dużym odśmiecaniem

Co to jest stałe pokolenie?

Stała generacja zawiera metadane wymagane przez JVM do opisu klas i metod używanych w aplikacji. Generowanie ciągłe jest zapełniane przez JVM w czasie wykonywania na podstawie klas używanych przez aplikację.

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

Parametry PermSize i MaxPermSize zostaną teraz zignorowane

W jaki sposób trzy pokolenia oddziałują na siebie?

wprowadź opis zdjęcia tutaj

Artykuł na temat źródła obrazu i oracle technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Ogólny proces usuwania śmieci ” w powyższym artykule wyjaśnia interakcje między nimi za pomocą wielu diagramów.

Spójrz na diagram podsumowujący:

wprowadź opis zdjęcia tutaj

Ravindra babu
źródło
doskonale .. czy mogę wiedzieć, gdzie na tym obrazku znajduje się obszar metody, natywna paczka i stała pula uruchomieniowa? i co odpowiednio trzymają?
więcej informacji można znaleźć na docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html . Obszar metody jest tworzony podczas uruchamiania maszyny wirtualnej. Chociaż obszar metody jest logicznie częścią sterty, proste implementacje mogą zdecydować, że nie będzie go odśmiecać ani kompaktować. Każda pula stała w czasie wykonywania jest przydzielana z obszaru metody wirtualnej maszyny Java
Ravindra babu
czy jesteś pewien ... Czytałem już, że jest to część przestrzeni permgenowej (która nie jest stertą)? journaldev.com/2856/…
Dokumentacja Oracle jest bardziej autentyczna
Ravindra babu
Czy próg dla młodego pokolenia jest ustawiony w jednostkach czasu (np. Ms)? czy rundy GC?
Bardzo obiektywny,
16

Wirtualna maszyna Java jest podzielona na trzy generacje: młode, stare i stałe. Większość obiektów początkowo przydzielana jest młodemu pokoleniu. Stare pokolenie zawiera obiekty, które przetrwały pewną liczbę kolekcji młodego pokolenia, a także duże obiekty, które mogą być przydzielane bezpośrednio w starym pokoleniu. Stała generacja przechowuje obiekty, które JVM uważa za wygodne w zarządzaniu urządzeniem do czyszczenia pamięci, takie jak obiekty opisujące klasy i metody, a także same klasy i metody.

Mark R.
źródło
1

Pamięć w SunHotSpot JVM jest podzielona na trzy pokolenia: młode pokolenie, stare pokolenie i stałe pokolenie.

  • Young Generation: nowo utworzone obiekty są przydzielane młodemu genowi.
  • Stara generacja: Jeśli nowy obiekt zażąda większej przestrzeni sterty, zostaje przydzielony bezpośrednio do starej generacji. Również obiekty, które przetrwały kilka cykli GC, są awansowane do starego generatora, tj. Obiekty o długowiecznym obiekcie w starym gen.
  • Generacja stała: Generacja stała przechowuje obiekty, które JVM uważa za wygodne w zarządzaniu urządzeniem do czyszczenia pamięci, takie jak obiekty opisujące klasy i metody, a także same klasy i metody.

FYI: Stały gen nie jest uważany za część sterty Java.

W jaki sposób trzy pokolenia oddziałują na siebie? Przedmioty (z wyjątkiem dużych) są najpierw przydzielane młodemu pokoleniu. Jeśli obiekt pozostanie przy życiu po x nie. cykli usuwania śmieci jest promowany do starego / dzierżawionego gen. Stąd możemy powiedzieć, że młody gen zawiera obiekty krótkotrwałe, podczas gdy stary gen zawiera obiekty o długim życiu. Stały gen nie wchodzi w interakcje z pozostałymi dwoma pokoleniami.

KrityAg
źródło