Терминология кучи Java:молодые, старые и постоянные поколения?
-
22-09-2019 - |
Вопрос
Я пытаюсь понять, что такое концепции Молодые, Старый и постоянные поколения находятся в терминологии 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, это включает область кэша кода, содержащую память, которая будет использоваться для компиляции и хранения машинного кода.
Что такое молодое поколение?
Тот самый Молодое поколение это место, где выделяются и устаревают все новые объекты.Когда молодое поколение заполняется, это приводит к незначительной уборке мусора.Молодое поколение, полное мертвых предметов, собирается очень быстро.Некоторые сохранившиеся предметы состарились и со временем перешли к старому поколению.
Что такое старое поколение?
Тот самый Старое Поколение используется для хранения давно сохранившихся предметов.Как правило, пороговое значение устанавливается для объекта молодого поколения, и когда этот возраст достигнут, объект перемещается в старое поколение.В конце концов, старое поколение должно быть собрано.Это событие называется крупный сбор мусора
Что такое постоянное поколение?
Тот самый Постоянное поколение содержит метаданные, необходимые JVM для описания классов и методов, используемых в приложении.Постоянная генерация заполняется JVM во время выполнения на основе классов, используемых приложением.
PermGen был заменен на Metaspace с момента выпуска Java 8.
Постоянный размер и максимальный размер теперь параметры будут игнорироваться
Как эти три поколения взаимодействуют друг с другом?
Источник изображения и учебная статья oracle technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
"Общий Процесс сбора мусора" в приведенной выше статье объясняется взаимодействие между ними с помощью множества диаграмм.
Взгляните на сводную диаграмму:
Виртуальная машина Java разделена на три поколения:молодое поколение, старое поколение и постоянное поколение.Большинство объектов изначально выделяются в молодом поколении.Старое поколение содержит объекты, сохранившиеся в некотором количестве коллекций молодого поколения, а также некоторые большие объекты, которые могут быть выделены непосредственно в старом поколении.Постоянное поколение содержит объекты, которыми JVM считает удобным управлять сборщик мусора, например объекты, описывающие классы и методы, а также сами классы и методы.
Память в SunHotSpot JVM организована в три поколения:молодое поколение, старое поколение и постоянное поколение.
- Молодое поколение :вновь созданные объекты выделяются молодому поколению.
- Старое поколение:Если новый объект запрашивает больший объем кучи, он выделяется непосредственно в старом поколении.Кроме того, объекты, пережившие несколько циклов GC, переводятся в старое поколение, т. е. в дом долгоживущих объектов в старом поколении.
- Постоянное поколение:Постоянное поколение содержит объекты, которыми JVM считает удобным управлять сборщик мусора, например объекты, описывающие классы и методы, а также сами классы и методы.
К вашему сведению:Постоянный ген не считается частью кучи Java.
Как эти три поколения взаимодействуют/относятся друг к другу?Объекты (кроме крупных) в первую очередь выделяются молодому поколению.Если объект останется живым после x нет.циклов сборки мусора он повышается до старого/штатного поколения.Следовательно, мы можем сказать, что молодой род содержит объекты с коротким сроком жизни, а старый род содержит объекты с долгой жизнью.Постоянный ген не взаимодействует с двумя другими поколениями.