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

StackOverflow https://stackoverflow.com/questions/2129044

Вопрос

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

Мои вопросы таковы:

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

Решение

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

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

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

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

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

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

Другие советы

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

Молодое поколение :Это место, где жили в течение короткого периода и разделенное на два пространства:

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

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

  • Арендуемое Пространство: Этот пул памяти содержит объекты, которые выжили после многократной сборки мусора, что означает объект, который выжил после сборки мусора из оставшегося пространства.

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

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

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

enter image description here

Вежливость

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

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

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

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

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

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

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

Постоянный размер и максимальный размер теперь параметры будут игнорироваться

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

enter image description here

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

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

Взгляните на сводную диаграмму:

enter image description here

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top