Молодое, штатное и пермское поколение - PullRequest
58 голосов
/ 15 января 2010

Я запутался с кучей, молодым, штатным и пермским поколением.

Может кто-нибудь объяснить, пожалуйста?

Ответы [ 4 ]

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

Java-сборщик мусора называется Generative Garbage Collector . Объекты в приложении живут в течение различных отрезков времени в зависимости от того, где они созданы и как они используются. Ключевым моментом здесь является то, что использование различных стратегий сбора мусора для недолговечных и долгоживущих объектов позволяет оптимизировать сборщик мусора специально для каждого случая.

Грубо говоря, поскольку объекты "выживают" в повторяющихся сборках мусора в Молодом поколении , они переносятся в Защищенное поколение . Permanent Generation - это особый случай, он содержит объекты, которые необходимы JVM, которые не обязательно представлены в вашей программе, например объекты, которые представляют классы и методы.

Поскольку Young Generation обычно содержит много мусора, оно оптимизировано для одновременного избавления от большого количества неиспользуемых объектов. Tenured Generation , поскольку он содержит объекты с более длительным сроком службы, оптимизирован для быстрой сборки мусора без больших затрат памяти.

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

Тем не менее, существует простое историческое устройство, которое все еще полезно на концептуальном уровне. Исторически Young Generation было бы копировальным коллектором , а Tenured Generation было бы меткой и сборщиком развертки . копировальный коллектор практически не платит ЦП за избавление от мусора, большая часть затрат приходится на поддержку живых объектов, цена этой эффективности - более интенсивное использование памяти. метка и сборщик развертки оплачивает некоторую стоимость ЦП как для живых, так и для неиспользуемых объектов, но использует память более эффективно.

28 голосов
/ 30 ноября 2015

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

Пространство кучи Java разделено на три области или поколения для сбора мусора, называемого Молодое поколение, Старое или постоянное поколение и Постоянное поколение . Постоянная генерация - это сборка мусора во время полного gc в горячей точке JVM

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

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

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

PermGen был заменен на Metaspace с момента выпуска Java 8. Параметры PermSize & MaxPermSize теперь будут игнорироваться. Взгляните на эту статью dzone от Pierre - Hugues Charbonneau, чтобы понять о Metaspace .

enter image description here

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

Более подробную информацию см. В той же статье.

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

Все объекты в куче выживают, когда на них ссылаются. Когда их не будет больше, сборщик мусора (GC) восстановит их память.

PermGen, Young и Tenured являются различными классификациями объектов (или пространств в куче, где они могут быть).

PermGen: эти объекты всегда будут рядом, они не будут собирать мусор. Существуют объекты классов, интернированные строки и т. Д. Я не знаю, есть ли там GC (когда система выгружает классы ... но это ненормально)

Young: когда объект создан, он здесь.

Срок владения: объект переходит в эту классификацию / категорию, когда он выживает за N проходов GC (выжить = проходы GC, но на этот объект ссылаются, поэтому он не может быть возвращен).

В зависимости от используемого ГХ и некоторой параметризации, ГХ проходит более или менее часто.

Тогда сборка мусора может иметь разные подходы к обработке объектов в куче. Эта классификация объектов помогает это сделать.

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

Вот еще одна отличная (хотя и длинная) статья о том, как настроить / изменить параметры GC, которая может помочь вам понять даже больше:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/

Очень полезное чтение, если у вас есть проблемы с GC, и вам нужно знать, как читать журналы GC, или вам нужно понять, как работает ваш текущий сборщик GC.

Если вы хотите подключить удаленный мониторинг работающей системы, чтобы увидеть использование памяти в режиме реального времени и запуски GC, проверьте этот инструмент:

http://java.sun.com/performance/jvmstat/visualgc.html

...