Терминология кучи Java: молодые, старые и постоянные поколения?
Я пытаюсь понять, как понятия молодые, старый и постоянный поколений в терминологии кучи Java, и более конкретно взаимодействия между тремя поколениями.
мои вопросы:
- что такое молодое поколение?
- что такое старое поколение?
- что такое постоянное поколение?
- как взаимодействуют/связаны три поколения друг с другом?
8 ответов
Это похоже на обычное недоразумение. В JVM Oracle постоянное поколение не является частью кучи. Это отдельное пространство для определений классов и связанных данных. В Java 6 и более ранних версиях интернированные строки также хранились в постоянном поколении. В Java 7 интернированные строки хранятся в основной куче объектов.
здесь хороший пост на постоянное поколение.
Мне нравятся описания, приведенные для каждого пространства в Oracle руководство с помощью jconsole:
для Точки доступа Java VM, память пулы для последовательного сбора мусора заключаться в следующем.
- Eden Space( heap): пул, из которого изначально выделяется память для большинства объектов.
- Survivor Space( куча): пул, содержащий уцелевшие объекты сбор мусора в Эдеме пространство.
- Tenured Generation( heap): пул, содержащий объекты, которые существовали в течение некоторого времени в пространство оставшегося в живых.
- постоянное поколение( не-куча): пул содержа полностью отражательное данные самой виртуальной машины, например, объекты class и method. С Java VMs, которые используют общий доступ к данным класса, это поколение разделено на только для чтения и чтения-записи зоны.
- Code Cache( non-heap): горячая точка Java VM также включает в себя кэш кода, содержащая память, которая используется для сбор и хранение родной код.
Java использует сборку мусора поколений. Это означает, что если у вас есть объект foo (который является экземпляром некоторого класса), чем больше событий сборки мусора он выживает (если на него все еще есть ссылки), тем дальше он продвигается. Он начинается в молодом поколении (которое само разделено на несколько пространств - Эдем и Выживший) и в конечном итоге закончится в поколении, если оно выживет достаточно долго.
куча делится на молодое и старое поколения следующим образом:
Молодые: это место, где жили в течение короткого периода и разделены на два пространства:
- Eden Space: при создании объекта с использованием новой выделенной памяти ключевых слов на этом пространстве.
- Выживший Пробел: это пул, который содержит объекты, которые имеют выжил после сбора мусора java из Eden пространство.
Старый : этот бассейн в основном содержат ординарный и виртуальных (зарезервировано) пространство и будет содержать те объекты, которые выжили после сбора мусора от молодого поколения.
- Хранилища: этот пул памяти содержит объекты, которые сохранились после нескольких сборщиков мусора означает объект, который сохранился после сбора мусора от Survivor пространство.
Постоянной Генерации : этот пул памяти, как имя, также содержит постоянные метаданные класса и информацию о дескрипторах, поэтому пространство PermGen всегда зарезервировано для классов и тех, которые привязаны к классам, например статические члены.
Обновление Java8: PermGen заменяется Metaspace что очень похоже.
Основное отличие заключается в том, что Metaspace динамически изменяет размеры т. е. он может расширяться во время выполнения.
Java Metaspace space: unbounded (по умолчанию)
Кэш Код (виртуальный или зарезервированный): если вы используете HotSpot Java VM, это включает область кэша кода, содержащую память, которая будет использоваться для компиляции и хранения собственного кода.
что такое молодое поколение?
на Молодые - это место, где выделяются и стареют все новые объекты. Когда молодое поколение заполняется, это вызывает незначительную сборку мусора. Молодое поколение, полное мертвых предметов, собирается очень быстро. Некоторые уцелевшие объекты стареют и со временем переходят к старому поколению.
что такое старое поколение?
на Старый используется для хранения долго уцелевших объектов. Обычно для объекта молодого поколения задается пороговое значение, и при достижении этого возраста объект перемещается в старое поколение. В конце концов, старое поколение должно быть собрано. Это событие называется крупного мусора
что такое постоянное поколение?
на постоянный содержит метаданные, необходимые JVM для описания классов и методов, используемых в приложение. Постоянное поколение заполняется JVM во время выполнения на основе классов, используемых приложением.
PermGen был заменен на Metaspace с момента выпуска Java 8.
PermSize & MaxPermSize параметры теперь будут игнорироваться
как взаимодействуют/соотносятся друг с другом три поколения?
Источник изображения и Oracle technetwork учебная статья: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
"Общий Процесс Сбора Мусора " в приведенной выше статье объясняется взаимодействие между ними со многими диаграммами.
взгляните на сводную диаграмму:
виртуальная машина Java организована в три поколения: молодое поколение, старое поколение и постоянное поколение. Большинство объектов изначально выделяется в молодом поколении. Старое поколение содержит объекты, которые пережили некоторое количество коллекций молодого поколения, а также некоторые крупные объекты, которые могут быть выделены непосредственно в старом поколении. Постоянное поколение содержит объекты, которые JVM находит удобными для управления сборщиком мусора, такие как в качестве объектов, описывающих классы и методы, а также сами классы и методы.
в этой статье очень хороший обзор на сборщики мусора. Он определяет основные понятия и терминологию сбора мусора и включает в себя множество пояснительных рисунков. Это "должен прочитать" для всех, кто заинтересован в том, как работает автоматическое распределение памяти; чтение это сделает его гораздо проще для вас, чтобы прочитать и понять различные документы, которые другие указали на.
(в этом документе отсутствует какая-либо информация о исследованиях после 1993 года сборщики мусора, особенно весь бизнес многоядерных систем. Еще, вы должны научиться ходить прежде чем научиться бегать.)
предполагая, что вы говорите о Sun JDK / OpenJDK, см. страницу на веб-сайте OpenJDK на Управление Хранилища. Есть несколько ссылок на еще больше информации в нижней части.
хотя речь идет о настройке, я не могу устоять, рекомендую это документ взгляните на Главу 3 и углубитесь, если хотите.
память в SunHotSpot JVM организована в три поколения: молодое поколение, старое поколение и постоянное поколение.
- молодое поколение: вновь созданные объекты выделяются молодому поколению.
- старое поколение: если новый объект запрашивает большее пространство кучи, он выделяется непосредственно в старое поколение. Также объекты, которые пережили несколько циклов GC, продвигаются к старому поколению i.e долгоживущие объекты дома в старом гене.
- постоянное поколение: постоянное поколение содержит объекты, которые JVM находит удобными для управления сборщиком мусора, такие как объекты, описывающие классы и методы, а также сами классы и методы.
FYI: постоянный gen не считается частью кучи Java.
как взаимодействуют/соотносятся друг с другом три поколения? Объекты(за исключением больших) сначала выделяются молодое поколение. Если объект остается в живых после x no. из циклов сбора мусора он получает повышение до старого / tenured gen. Поэтому мы можем сказать, что молодой род содержит короткоживущие объекты, в то время как старый род содержит объекты, имеющие долгую жизнь. Постоянный род не взаимодействует с двумя другими поколениями.