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

318

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

Мои вопросы:

  • Что такое молодое поколение?
  • Что такое старое поколение?
  • Что такое постоянное поколение?
  • Как три поколения взаимодействуют / связаны друг с другом?
knorv
источник
Предполагая, что вы говорите о Sun JDK / OpenJDK, см. Страницу на веб-сайте OpenJDK по управлению хранением . Внизу есть несколько ссылок на дополнительную информацию.
Николас Райли
1
Также связан с этим вопросом «штатное поколение»
gstackoverflow

Ответы:

304

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

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

Мне нравятся описания, приведенные для каждого пробела в руководстве Oracle по JConsole :

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

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

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

Джошуа Маккиннон
источник
2
Я считаю, что в Java 7 строки больше не интернированы в постоянном поколении.
Тим Гудман
Вы правы, я удивлен, что это сохранилось задолго до упоминания. Затем в Java 8 постоянное поколение будет заменено metaspace (хотя я не уверен, насколько оно будет отличаться, кроме неограниченного по умолчанию)
Джошуа Маккиннон
9
Джошуа - «старый» синонимичен с «наемным», и «новый» синонимичен с «оставшийся в живых?»
Joadha
1
Пермская генерация
2
Если вы все еще ждете ответа, да, вы правы @joadha. Проверьте эту ссылку: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc
197

Куча делится на молодое и старое поколения следующим образом:

Молодое поколение : это место, где жили недолго и делятся на два пространства:

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

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

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

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

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

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

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

учтивость

Premraj
источник
@Premraj, что это означает, что Metaspace динамически изменяет размеры, т. Е. Может расширяться во время выполнения. ? Единственная разница, что по умолчанию у него нет границы вверх?
gstackoverflow
1
отлично ... могу я знать, где область метода, nativestack и пул констант времени выполнения находятся на этой картинке? и что они держат соответственно?
если кеш кода используется для кода собственного метода, что будет иметь стек собственных методов (у каждого потока будет один)?
49

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

Молодое поколение , где все новые объекты выделяются и в возрасте. Когда молодое поколение заполняется, это вызывает незначительный сбор мусора. Молодое поколение, полное мертвых предметов, собирается очень быстро. Некоторые сохранившиеся объекты стареют и в итоге переходят к старому поколению.

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

Старое поколение используется для хранения долго уцелевших объектов. Как правило, для объекта молодого поколения устанавливается порог, и при достижении этого возраста объект переносится в старое поколение. В конце концов старое поколение должно быть собрано. Это событие называется главной сборкой мусора

Что такое постоянное поколение?

Постоянное поколение содержит метаданные , необходимые JVM для описания классов и методов , используемых в приложении. Постоянное поколение заполняется JVM во время выполнения на основе классов, используемых приложением.

PermGen был заменен на Metaspace с момента выпуска Java 8.

Параметры PermSize и MaxPermSize теперь будут игнорироваться

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

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

Учебное пособие по источникам изображений и оракулам: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

« Общий процесс сбора мусора » в вышеприведенной статье объясняет взаимодействие между ними со многими диаграммами.

Посмотрите на сводную диаграмму:

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

Равиндра Бабу
источник
отлично ... могу я знать, где область метода, nativestack и пул констант времени выполнения находятся на этой картинке? и что они держат соответственно?
обратитесь к docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html для получения дополнительной информации. Область метода создается при запуске виртуальной машины. Хотя область метода логически является частью кучи, простые реализации могут не собирать и не собирать мусор. Каждый постоянный пул времени выполнения выделяется из области методов виртуальной машины Java
Ravindra babu
ты уверен ... я читал, что это часть пермгена (что не куча)? journaldev.com/2856/...
Документация Oracle более достоверна
Равиндра Бабу
Установлен ли порог для объекта молодого поколения в единицах времени (например, мс)? или GC раундов?
Очень объективно
16

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

Марк Р
источник
1

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

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

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

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

KrityAg
источник