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

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

Мои вопросы:

  • Каково молодое поколение?
  • Каково старое поколение?
  • Каково постоянное поколение?
  • Как эти три поколения взаимодействуют/касаются друг друга?
304
задан Hearen 19 March 2019 в 00:16
поделиться

2 ответа

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

Вот хороший пост о постоянной генерации .

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

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

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

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

291
ответ дан 23 November 2019 в 01:23
поделиться

Похоже, это работает (на основе ответа Игнасио). Используя субоболочку, этот документ правильно направляется в xsltproc, но все еще проходит через хвостовую часть после.

VERSION=$((xsltproc - ../pom.xml | tail -1) << EOF
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"><xsl:value-of select="/project/version"/></xsl:template>
</xsl:stylesheet>
EOF
)
-121--2337637-

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

15
ответ дан 23 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: