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?
Odpowiedzi:
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 :
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.
źródło
Young Generation : To miejsce, w którym mieszkał przez krótki okres i podzielony na dwie przestrzenie:
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.
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.
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.
Kurtuazja
źródło
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.
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
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
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:
źródło
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.
źródło
Pamięć w SunHotSpot JVM jest podzielona na trzy pokolenia: młode pokolenie, stare pokolenie i stałe pokolenie.
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.
źródło