Пермген и куча, различие и их значение

друзья,

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

объяснение, связанное со спецификацией Java VM, было бы действительно полезно

спасибо Punith

5 ответов


память (куча) управляется в поколениях или пулах памяти, содержащих объекты разных возрастов. Сбор мусора происходит в каждом поколении, когда поколение заполняет. Объекты выделяются в поколении для более молодых объектов или young generation, и из-за детской смертности большинство объектов умирают там.

когда строится какой-либо новый объект, он отправляется в пространство Эдема, которое является частью Young Generation.

если объект все еще жив через некоторое время, он переходит в tenured generation где долгоживущие предметы лежат.

если объект должен жить до тех пор, пока процесс не существует, объект перемещается в Perm Generation.Java classes хранятся в постоянном поколении.


хорошие ссылки есть в что на самом деле означает PermGen?. Особенно понравилось это блог


Ну, я не эксперт, но память PermGem находится внутри кучи, так как это как специальное место, где все классы загружаются во время выполнения. Поэтому, если у вас слишком много классов, PermGem выдает исключение OutOfMemoryException. И хорошо куча хранит объекты, которые вы создаете в своем java-коде, где GC собирает объекты, на которые не ссылается какая-либо переменная в запущенном потоке в стеке.


Я считаю, что Permgen-это область памяти только внутри памяти кучи. Он создан для специальной цели, такой как удержание строки.

весь созданный объект не получает память Permgen, это только для специального класса, такого как String в JDK 6 или ниже.

в современных версиях JDK, таких как 8 и выше, Pergen не найден, однако вводится новая память, такая как Non Heap и другие различные кэш-памяти.


У меня были те же сомнения относительно PermGen и других частей памяти кучи. После некоторых поисков, вот что я, наконец, пришел к выводу.

Java HotSpot VM нужна память, которую она получает от операционной системы, эта память называется памятью кучи. Теперь куча памяти, как известно, для хранения объектов содержит и другие важные вещи.

короткие живые объекты Java хранятся в молодом поколении, и если эти объекты по-прежнему необходимы для дальнейшего исполнение затем, оно переносится на tenure / старое поколение. И в зависимости от типа сборщика мусора поколения, память очищена.

Как насчет постоянного поколения (PermGen)? Java HotSpot VM загружает классы / структуру классов в PermGen, который используется JVM для хранения загруженных классов и других метаданных. PermGen не используется для хранения предметов.

помимо объектов и структуры классов, код JVM сам загружает код и данные агента профилировщика так далее.

Итак, в основном, куча = объект + структура класса + архитектура JVM.

ссылки: Java Docs, руководство JAVA GC