Терминология кучи Java: молодое, старое и постоянное поколение?
Я пытаюсь понять, как концепции молодого, старого и постоянного поколений в терминологии кучи Java, а более конкретно, взаимодействия между тремя поколениями.
Мои вопросы:
- Что такое молодое поколение?
- Что такое старое поколение?
- Что такое постоянное поколение?
- Как три поколения взаимодействуют / связаны друг с другом?
8 ответов
Это кажется распространенным недоразумением. В Oracle JVM постоянное поколение не является частью кучи. Это отдельное пространство для определений классов и связанных данных. В Java 6 и ранее интернированные строки также сохранялись в постоянном поколении. В Java 7 интернированные строки хранятся в куче основного объекта.
Вот хороший пост о постоянном поколении.
Мне нравятся описания, приведенные для каждого пробела в руководстве Oracle по JConsole:
Для Java VM HotSpot пулы памяти для последовательной сборки мусора следующие.
- Eden Space (куча): Пул, из которого память изначально выделена для большинства объектов.
- Пространство оставшихся в живых (куча): Пул, содержащий объекты, которые выжили после сбора мусора в пространстве Эдема.
- Tenured Generation (heap): пул, содержащий объекты, которые существовали в пространстве выживших в течение некоторого времени.
- Постоянная генерация (без кучи): пул, содержащий все отражающие данные самой виртуальной машины, такие как объекты класса и метода. В случае виртуальных машин Java, которые используют совместное использование данных классов, это поколение делится на области только для чтения и чтения-записи.
- Кэш кода (без кучи): Java VM HotSpot также включает в себя кэш кода, содержащий память, которая используется для компиляции и хранения собственного кода.
Java использует сборку мусора поколений. Это означает, что если у вас есть объект foo (который является экземпляром некоторого класса), чем больше событий сборки мусора он переживет (если на него все еще есть ссылки), тем дальше он будет продвигаться. Он начинается в молодом поколении (которое само делится на несколько пространств - Эдем и Выживший) и в конечном итоге окажется в поколении, оставшемся в должности, если оно выживет достаточно долго.
Куча делится на молодое и старое поколения следующим образом:
Молодое поколение: это место, где жили недолго и делятся на два пространства:
- Eden Space: когда объект создан с использованием новой памяти ключевых слов, выделенной на этом пространстве.
- Survivor Space: это пул, который содержит объекты, которые сохранились после сборки мусора Java из пространства Eden.
Старое поколение. Этот пул в основном содержит постоянное и виртуальное (зарезервированное) пространство и будет содержать те объекты, которые сохранились после сборки мусора в Young Generation.
- Защищенное пространство: Этот пул памяти содержит объекты, которые сохранились после многократного сбора мусора, означает объект, который сохранился после сбора мусора из пространства Survivor.
Перманентная генерация: этот пул памяти, как говорится в имени, содержит метаданные и дескрипторы постоянной информации о классе, поэтому пространство PermGen всегда зарезервировано для классов и тех, которые связаны с классами, например, статическими членами.
Обновление Java8: PermGen заменен Metaspace, который очень похож.
Основное отличие состоит в том, что Metaspace динамически изменяет размеры, т. Е. Может расширяться во время выполнения.
Пространство метапространства Java: неограниченное (по умолчанию)
Кэш кода (виртуальный или зарезервированный): если вы используете HotSpot Java VM, это включает в себя область кэша кода, содержащую память, которая будет использоваться для компиляции и хранения собственного кода.
Что такое молодое поколение?
Молодое поколение - это место, где все новые объекты выделяются и стареют. Когда молодое поколение заполняется, это вызывает незначительный сбор мусора. Молодое поколение, полное мертвых предметов, собирается очень быстро. Некоторые сохранившиеся объекты стареют и в конечном итоге переходят к старому поколению.
Что такое старое поколение?
Старое поколение используется для хранения давно сохранившихся объектов. Как правило, для объекта молодого поколения устанавливается порог, и при достижении этого возраста объект переносится в старое поколение. В конце концов, старое поколение должно быть собрано. Это событие называется главной сборкой мусора
Что такое постоянное поколение?
Перманентная генерация содержит метаданные, необходимые JVM для описания классов и методов, используемых в приложении. Постоянное поколение заполняется JVM во время выполнения на основе классов, используемых приложением.
PermGen был заменен на Metaspace с момента выпуска Java 8.
Параметры PermSize и MaxPermSize теперь будут игнорироваться
Как три поколения взаимодействуют / связаны друг с другом?
Учебная статья об источнике изображений и технологии Oracle: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
"Общий процесс сбора мусора" в вышеприведенной статье объясняет взаимодействие между ними с помощью множества диаграмм.
Посмотрите на сводную диаграмму:
Виртуальная машина Java состоит из трех поколений: молодого поколения, старого поколения и постоянного поколения. Большинство объектов изначально выделены молодому поколению. Старое поколение содержит объекты, которые пережили некоторое количество коллекций молодого поколения, а также некоторые крупные объекты, которые могут быть выделены непосредственно в старом поколении. Постоянное поколение содержит объекты, которые JVM считает удобными для управления сборщиком мусора, такие как объекты, описывающие классы и методы, а также сами классы и методы.
Эта статья - очень хороший обзор по сборщикам мусора. Он определяет основные понятия и терминологию сбора мусора и включает в себя множество пояснительных рисунков. Это "необходимо прочитать" для всех, кому интересно, как работает автоматическое распределение памяти; прочитав его, вам будет намного легче читать и понимать различные документы, на которые указывают другие.
(В этом документе отсутствует какая-либо информация об исследованиях сборщиков мусора после 1993 года, особенно о бизнесе многоядерных систем. Тем не менее, вы должны научиться ходить, прежде чем научиться бегать.)
Память в SunHotSpot JVM состоит из трех поколений: молодое поколение, старое поколение и постоянное поколение.
- Молодое поколение: вновь созданные объекты выделяются молодому поколению.
- Старое поколение: если новый объект запрашивает большее пространство кучи, он выделяется непосредственно в старое поколение. Также объекты, которые пережили несколько циклов GC, переводятся в старое поколение, т.е.
- Постоянное поколение: постоянное поколение содержит объекты, которые JVM считает удобными для управления сборщиком мусора, такие как объекты, описывающие классы и методы, а также сами классы и методы.
К вашему сведению: постоянный ген не считается частью кучи Java.
Как три поколения взаимодействуют / связаны друг с другом? Объекты (кроме крупных) первыми выделяются молодому поколению. Если объект остается живым после х нет. из циклов сбора мусора он продвигается к старому / постоянному поколению. Следовательно, мы можем сказать, что молодой ген содержит недолговечные объекты, в то время как старый ген содержит объекты, имеющие долгую жизнь. Постоянный ген не взаимодействует с двумя другими поколениями.
Предполагая, что вы говорите о Sun JDK/OpenJDK, см. Страницу на веб-сайте OpenJDK по управлению хранением. Внизу есть несколько ссылок на дополнительную информацию.
Хотя речь идет о настройке, я не могу удержаться, рекомендую этот документ взглянуть на главу 3 и углубиться, если хотите.