Терминология кучи Java: молодое, старое и постоянное поколение? - PullRequest
298 голосов
/ 25 января 2010

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

Мои вопросы:

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

Ответы [ 5 ]

283 голосов
/ 25 января 2010

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

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

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

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

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

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

173 голосов
/ 28 июня 2015

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

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

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

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

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

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

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

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

enter image description here

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

38 голосов
/ 22 марта 2016

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

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

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

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

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

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

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

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

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

enter image description here

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

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

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

enter image description here

15 голосов
/ 25 января 2010

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

0 голосов
/ 29 июня 2015

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

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

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

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

...