Терминология на Java heap: млади, стари и постоянни поколения?

Опитвам се да разбера какви са концепциите за млади, стари и постоянни поколения в терминологията на Java heap и по-конкретно взаимодействията между трите поколения.

Въпросите ми са:

  • Какво е младото поколение?
  • Какво е старото поколение?
  • Какво представлява постоянното поколение?
  • Как трите поколения си взаимодействат/отнасят едно към друго?

person knorv    schedule 24.01.2010    source източник
comment
Ако приемем, че говорите за Sun JDK/OpenJDK, вижте страницата на уебсайта на OpenJDK на Управление на хранилището. В долната част има няколко връзки към още повече информация.   -  person Nicholas Riley    schedule 25.01.2010
comment
също е свързано с този въпрос наемно поколение   -  person gstackoverflow    schedule 20.10.2014


Отговори (5)


Това изглежда като често срещано недоразумение. В JVM на Oracle постоянното генериране не е част от купчината. Това е отделно пространство за дефиниции на класове и свързани данни. В Java 6 и по-рано, интернираните низове също се съхраняват в постоянното генериране. В Java 7 интернираните низове се съхраняват в основния обем на обекта.

Ето една добра публикация за постоянно поколение.

Харесвам описанията, дадени за всяко пространство в ръководството на Oracle за JConsole:

За HotSpot Java VM пуловете памет за серийно събиране на отпадъци са следните.

  • Eden Space (купчина): Пулът, от който първоначално се разпределя памет за повечето обекти.
  • Survivor Space (купчина): Басейнът, съдържащ обекти, които са оцелели след събирането на боклука в пространството Eden.
  • Tenured Generation (купчина): Пулът, съдържащ обекти, които са съществували известно време в пространството на оцелелите.
  • Постоянно генериране (без купчина): Пулът, съдържащ всички отразяващи данни на самата виртуална машина, като обекти на клас и метод. С Java VM, които използват споделяне на данни от клас, това поколение е разделено на области само за четене и области за четене и запис.
  • Кодов кеш (без купчина): HotSpot Java VM също включва кодов кеш, съдържащ памет, която се използва за компилиране и съхранение на естествен код.

Java използва поколение събиране на отпадъци. Това означава, че ако имате обект foo (който е екземпляр на някакъв клас), колкото повече събития за събиране на боклук оцелява (ако все още има препратки към него), толкова повече се повишава. Започва в младото поколение (което само по себе си е разделено на множество пространства - Eden и Survivor) и в крайна сметка ще завърши в поколението с наем, ако оцелее достатъчно дълго.

person Joshua McKinnon    schedule 24.01.2010
comment
Вярвам, че от Java 7 низовете вече не се включват в постоянното генериране. - person Tim Goodman; 23.09.2013
comment
Прав си, изненадан съм, че това оцеля толкова дълго преди споменаването. След това в Java 8 постоянното генериране ще бъде заменено от метапространство (въпреки че не съм сигурен колко различно ще бъде това наистина, освен че е неограничено по подразбиране) - person Joshua McKinnon; 23.09.2013
comment
Джошуа -- стар синоним ли е на титуляр, а нов синоним ли е на оцелял? - person joadha; 04.02.2014
comment
perm gen е приложим само преди Java 8. - person engineer; 12.06.2014
comment
@lwpro2 В 8 permGen не се премахва, но се поставя в секцията Old Generation. - person Bhavik Ambani; 31.12.2014
comment
@Joshua McKinnon Здравейте, господине, имам един въпрос каква е употребата на различните пространства на паметта за променливи и аз конкретно говоря за Eden, Survivor и Tenured space? - person Vikas Verma; 18.08.2015
comment
Благодаря, че спомена Oracle. Никога не ми се е налагало да се притеснявам за PermGen на IBM JDK. - person Oleg Mikheev; 31.10.2016
comment
отлично.. мога ли да знам къде се намира областта на метода, nativestack и постоянен пул по време на изпълнение в тази снимка? и какво държат съответно? - person ; 09.06.2017
comment
В случай, че все още чакате отговор, да, прав сте @joadha. Вижте тази връзка: codeahoy.com/2017/08/ 06/basics-of-java-garbage-collection - person recepinanc; 08.12.2019

Грамадата е разделена на млади и стари поколения, както следва:

Младо поколение: Това е място, където е живяно за кратък период от време и разделено на две пространства:

  • Eden Space : Когато обектът е създаден с помощта на памет за нова ключова дума, разпределена в това пространство.
  • Survivor Space : Това е пулът, който съдържа обекти, които са оцелели след събиране на отпадъци от Java от Eden space.

Старо поколение: Този басейн основно съдържа наемно и виртуално (резервирано) пространство и ще съхранява тези обекти, които са оцелели след събирането на боклука от Young Generation.

  • Собствено пространство: Този пул памет съдържа обекти, които са оцелели след многократно събиране на боклук, означава обект, който е оцелял след събиране на боклук от пространството Survivor.

Постоянно генериране: Този пул памет, както казва името, съдържа постоянни метаданни за клас и информация за дескриптори, така че пространството в PermGen винаги е запазено за класове и тези, които са свързани с класовете, например статични членове.

Актуализация на Java8: PermGen се заменя с Metaspace, което е много подобно.
Основната разлика е, че Metaspace преоразмерява динамично, т.е. разширяване по време на изпълнение.
Java Metaspace пространство: неограничено (по подразбиране)

Кеш на код (виртуален или запазен): Ако използвате HotSpot Java VM, това включва област на кеша на кода, която съдържа памет, която ще се използва за компилиране и съхранение на собствен код.

въведете описание на изображението тук

С любезното съдействие

person Premraj    schedule 28.06.2015
comment
@Premraj какво означава Metaspace преоразмерява динамично, т.е. може да се разширява по време на изпълнение.? Единствената разлика е, че по подразбиране няма горна граница? - person gstackoverflow; 28.12.2016
comment
отлично.. мога ли да знам къде се намира областта на метода, nativestack и постоянен пул по време на изпълнение в тази снимка? и какво държат съответно? - person ; 09.06.2017
comment
ако кешът на кода се използва за код на естествения метод, какво ще има стекът на естествения метод (всяка нишка ще има такъв)? - person ; 09.06.2017

Какво е младото поколение?

Младото поколение е мястото, където всички нови обекти се разпределят и остаряват. Когато младото поколение се напълни, това води до незначително събиране на боклука. Много бързо се събира младо поколение, пълно с мъртви предмети. Някои оцелели предмети са остарели и в крайна сметка преминават към старото поколение.

Какво е старото поколение?

Старото поколение се използва за съхраняване на отдавна оцелели обекти. Обикновено се задава праг за обект от младо поколение и когато тази възраст бъде достигната, обектът се премества към старото поколение. В крайна сметка старото поколение трябва да бъде събрано. Това събитие се нарича основно събиране на отпадъци

Какво представлява постоянното поколение?

Постоянното генериране съдържа метаданни, изисквани от JVM за описание на класовете и методите, използвани в приложението. Постоянното генериране се попълва от JVM по време на изпълнение въз основа на класове, използвани от приложението.

PermGen е заменен с Metaspace след издаването на Java 8.

Параметрите PermSize & MaxPermSize сега ще бъдат игнорирани

Как трите поколения си взаимодействат/отнасят едно към друго?

въведете описание на изображението тук

Източник на изображение и статия с урок за Oracle Technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Общият процес на събиране на боклук“ в горната статия обяснява взаимодействията между тях с много диаграми.

Разгледайте обобщената диаграма:

въведете описание на изображението тук

person Ravindra babu    schedule 22.03.2016
comment
отлично.. мога ли да знам къде се намира областта на метода, nativestack и постоянен пул по време на изпълнение в тази снимка? и какво държат съответно? - person ; 09.06.2017
comment
вижте docs.oracle.com/javase/specs/ jvms/se7/html/jvms-2.html за повече подробности. Областта на метода се създава при стартиране на виртуална машина. Въпреки че областта на метода логично е част от купчината, простите реализации може да изберат нито да събират боклука, нито да го компактират. Всеки пул от константи по време на изпълнение се разпределя от областта на метода на Java Virtual Machine - person Ravindra babu; 09.06.2017
comment
сигурен ли си...чел съм, че това е част от permgen space (което не е heap)? journaldev.com/2856/ - person ; 09.06.2017
comment
Документацията на Oracle е по-автентична - person Ravindra babu; 09.06.2017
comment
Определен ли е прагът за обект от младо поколение във времеви единици (напр. ms)? или GC кръгове? - person Very Objective; 18.08.2018

Виртуалната машина на Java е организирана в три поколения: младо поколение, старо поколение и постоянно поколение. Повечето обекти първоначално се разпределят в младото поколение. Старото поколение съдържа предмети, които са оцелели в колекциите на младото поколение, както и някои големи обекти, които могат да бъдат разпределени директно в старото поколение. Постоянното генериране съдържа обекти, които JVM намира за удобни за управление на събирача на отпадъци, като обекти, описващи класове и методи, както и самите класове и методи.

person Mark R    schedule 24.01.2010

Паметта в SunHotSpot JVM е организирана в три поколения: младо поколение, старо поколение и постоянно поколение.

  • Младо поколение : новосъздадените обекти се разпределят към младото поколение.
  • Старо поколение : Ако новият обект поиска по-голямо пространство на купчина, той се разпределя директно в старото поколение. Също така обекти, които са преживели няколко цикъла на GC, се повишават в старото поколение, т.е. дългоживеещите обекти се намират в старото поколение.
  • Постоянно генериране: Постоянното генериране съдържа обекти, които JVM намира за удобни за управление на събирача на отпадъци, като обекти, описващи класове и методи, както и самите класове и методи.

FYI: Постоянното поколение не се счита за част от Java heap.

Как трите поколения взаимодействат/свързват едно с друго? Обектите (с изключение на големите) първо се разпределят към младото поколение. Ако даден обект остане жив след x no. на циклите за събиране на боклука, той се повишава до стария/щатен ген. Следователно можем да кажем, че младият ген съдържа краткотрайните обекти, докато старият ген съдържа обектите с дълъг живот. Постоянният ген не взаимодейства с другите две поколения.

person KrityAg    schedule 29.06.2015