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

Я пытаюсь понять, что концепции молодых, старых и постоянных поколений содержатся в терминологии кучи Java, и, в частности, взаимодействия между три поколения.

Мои вопросы:

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

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)


Это похоже на распространенное недоразумение. В Oracle JVM постоянное поколение не является частью кучи. Это отдельное место для определений классов и связанных данных. В Java 6 и более ранних версиях интернированные строки также сохранялись в постоянной генерации. В Java 7 интернированные строки хранятся в куче основного объекта.

Вот хороший пост о постоянном поколении.

Мне нравятся описания каждого места в руководстве Oracle по JConsole.:

Для виртуальной машины Java HotSpot пулы памяти для последовательной сборки мусора следующие.

  • Eden Space (куча): пул, из которого изначально выделяется память для большинства объектов.
  • Пространство выжившего (куча): пул, содержащий объекты, которые пережили сборку мусора пространства Эдема.
  • Постоянное поколение (куча): пул, содержащий объекты, которые существовали в течение некоторого времени в пространстве выживших.
  • Постоянное создание (без кучи): пул, содержащий все отражающие данные самой виртуальной машины, такие как объекты классов и методов. В виртуальных машинах Java, использующих совместное использование данных классов, это поколение разделено на области только для чтения и для чтения-записи.
  • Кэш кода (без кучи): виртуальная машина Java HotSpot также включает в себя кеш кода, содержащий память, которая используется для компиляции и хранения собственного кода.

Java использует поколенческую сборку мусора. Это означает, что если у вас есть объект foo (который является экземпляром некоторого класса), чем больше событий сборки мусора он переживает (если на него все еще есть ссылки), тем дальше он продвигается. Он начинается в молодом поколении (которое само разделено на несколько пространств - Эдем и Выживший) и в конечном итоге перерастет в постоянное поколение, если просуществует достаточно долго.

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
перманент применим только до Java 8. - person engineer; 12.06.2014
comment
@ lwpro2 В 8 permGen не удаляется, а помещается в раздел Старого поколения. - person Bhavik Ambani; 31.12.2014
comment
@ Джошуа Маккиннон Привет, сэр, у меня есть один вопрос: каково использование разных пространств памяти для переменных, и я конкретно говорю об Eden, Survivor и Tenured пространстве? - person Vikas Verma; 18.08.2015
comment
Спасибо за упоминание Oracle. Мне никогда не приходилось беспокоиться о PermGen на IBM JDK. - person Oleg Mikheev; 31.10.2016
comment
отлично .. могу ли я узнать, где на этой картинке находятся область метода, собственный стек и пул констант времени выполнения? и что они держат соответственно? - 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.

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

  • Зарезервированное пространство: этот пул памяти содержит объекты, которые выжили после многократной сборки мусора, то есть объект, который выжил после сборки мусора из пространства Survivor.

Постоянное создание: Этот пул памяти, как указано в названии, также содержит постоянные метаданные класса и информацию о дескрипторах, поэтому пространство PermGen всегда зарезервировано для классов и тех, которые привязаны к классам, например, статические члены.

Обновление Java8: PermGen заменен на Metaspace, который очень похож.
Главное отличие состоит в том, что Metaspace изменяет размер динамически, т. е. может расширяться во время выполнения.
Пространство Java Metaspace: неограниченное (по умолчанию)

Кэш кода (виртуальный или зарезервированный): если вы используете виртуальную машину Java HotSpot, это включает область кэша кода, содержащую память, которая будет использоваться для компиляции и хранения собственного кода.

введите описание изображения здесь

Предоставлено

person Premraj    schedule 28.06.2015
comment
@Premraj, что это означает динамическое изменение размеров метапространства, т. Е. Оно может расширяться во время выполнения.? Единственная разница в том, что по умолчанию у него нет границы? - person gstackoverflow; 28.12.2016
comment
отлично .. могу ли я узнать, где на этой картинке находятся область метода, собственный стек и пул констант времени выполнения? и что они держат соответственно? - 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
отлично .. могу ли я узнать, где на этой картинке находятся область метода, собственный стек и пул констант времени выполнения? и что они держат соответственно? - person ; 09.06.2017
comment
см. docs.oracle.com/javase/specs/ jvms / se7 / html / jvms-2.html для получения дополнительных сведений. Область метода создается при запуске виртуальной машины. Хотя область метода логически является частью кучи, простые реализации могут решить не собирать мусор или не сжимать ее. Каждый пул констант времени выполнения выделяется из области методов виртуальной машины Java. - person Ravindra babu; 09.06.2017
comment
Вы уверены ... я читал, что это часть перманентного пространства (а это не куча)? journaldev.com/2856/ - person ; 09.06.2017
comment
Документация Oracle более достоверна - person Ravindra babu; 09.06.2017
comment
Установлен ли порог для объекта молодого поколения в единицах времени (например, мс)? или раунды GC? - person Very Objective; 18.08.2018

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

person Mark R    schedule 24.01.2010

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

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

К вашему сведению: постоянный генератор не считается частью кучи Java.

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

person KrityAg    schedule 29.06.2015