PermGen и куча, различие и их значение
Друзья,
Не могли бы вы дать мне значимость, разницу и использование для Кучи и Пермигена.
Также было бы хорошо знать, какой класс загружен в них соответственно.
Объяснение, связанное с спецификацией Java VM, было бы действительно полезно
Спасибо
Punith
Ответы
Ответ 1
Память (куча) управляется в поколениях или пулах памяти, в которых хранятся объекты разного возраста. Сбор мусора происходит в каждом поколении, когда поколение заполняется. Объекты выделяются в поколении для более молодых объектов или young generation
, а из-за младенческой смертности большинство объектов умирают там.
Когда какой-либо новый объект строится, он переходит в пространство Эдена, которое является частью young generation
.
Если объект все еще жив через некоторое время, он переходит к tenured generation
, где лежат объекты с длительным проживанием.
Если объект должен жить до завершения процесса, объект перемещается в Perm Generation
. Java classes
сохраняются в постоянном поколении.
Ответ 2
Хорошие ссылки есть в Что действительно означает PermGen?. Особенно понравилось это blog
Ответ 3
Ну, я не эксперт, но память PermGem находится внутри кучи, так как это особое место, где все классы загружаются во время выполнения. Поэтому, если у вас слишком много классов, PermGem генерирует исключение OutOfMemoryException. И хорошо куча хранит объекты, которые вы инициируете в своем java-коде, где GC собирает объекты, на которые не ссылается какая-либо переменная в текущем потоке в стеке.
Ответ 4
Я считаю, что Permgen - это область памяти внутри памяти кучи. Он создан для специального назначения, например, для String.
Весь созданный объект не получает память Permgen. Только для специальной кластеризации, такой как String, в JDK 6 или ниже.
В современных версиях JDK, таких как 8 и выше, Pergen не найден, однако появилась новая память, например Non Heap, и другие различные кэш-память.
Ответ 5
У меня были такие же сомнения относительно деталей PermGen и других частей памяти. После выполнения какого-то поиска, вот что я наконец сделал.
Java HotSpot VM нуждается в памяти, которую он получает от операционной системы, эта память называется памятью кучи. Теперь память кучи, известная тем, что хранит объекты, содержит и другие важные вещи.
Короткие живые объекты Java-объекты хранятся в молодом поколении, и если эти объекты по-прежнему необходимы для дальнейшего выполнения, то они переносятся на срок службы/старое поколение. И в зависимости от типа Generation Garbage Collector, память очищается.
Как насчет постоянного поколения (PermGen)? Java HotSpot VM загружает структуру классов/классов в PermGen, которая используется JVM для хранения загруженных классов и других метаданных. PermGen не используется для хранения объектов.
Помимо объектов и структуры классов, сам код JVM загружает код агента и данные профайлера и т.д.
Таким образом, в основном, структура heap = object + class + JVM.
Ссылки: Java Docs, Руководство по Java GC