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