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


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

мои вопросы:

  • что такое молодое поколение?
  • что такое старое поколение?
  • что такое постоянное поколение?
  • как взаимодействуют/соотносятся три поколения друг с другом?
8 270

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

enter image description here

вежливость

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

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

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

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

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

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

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

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

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

enter image description here

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

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

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

enter image description here

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

в этой статье очень хороший обзор на сборщики мусора. Он определяет основные понятия и терминологию сборки мусора и включает в себя множество пояснительных рисунков. Это "должен читать" для всех, кто заинтересован в том, как автоматическое выделение памяти работает; чтение это сделает его гораздо проще для вас, чтобы прочитать и понять различные документы, которые другие указали.

(в этом документе отсутствует какая-либо информация об исследованиях после 1993 года сборщики мусора, особенно весь бизнес многоядерных систем. Еще, вы должны научиться ходить прежде чем научиться бегать.)

предполагая, что вы говорите о Sun JDK/OpenJDK, см. страницу на веб-сайте OpenJDK на Управление Хранилища. Есть несколько ссылок на еще больше информации внизу.

хотя речь идет о настройке я не могу устоять рекомендую это документ взгляните на Главу 3 и углубитесь, если хотите.

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

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

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

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