Что такое пермское пространство?


88

Изучая профилирование памяти Java, я все время встречаю термин «постоянное пространство» в дополнение к «куче». Я знаю, что такое куча - что такое пермское пространство?


13
Java 8 полностью удалила эту концепцию и переместила в Metaspace
pramodc84

2
Ссылка хорошо объяснена здесь youtube.com/watch?v=PUUJ4rNpRhU
shareef

Ответы:


103

Это означает постоянное поколение :

Постоянная генерация является особенной, потому что она содержит метаданные, описывающие пользовательские классы (классы, не являющиеся частью языка Java). Примерами таких метаданных являются объекты, описывающие классы и методы, которые хранятся в постоянном поколении. Приложения с большой базой кода могут быстро заполнить этот сегмент кучи, что вызовет java.lang.OutOfMemoryError: PermGen независимо от того, насколько высок ваш -Xmx и сколько памяти у вас есть на машине.


Эндрю, мне просто интересно узнать, какой может быть размер PerGen?
gks

Просто любопытно, является ли permgen частью памяти кучи (как указано в этом ответе) или это не куча (как указано в этом ответе - stackoverflow.com/a/31103100/3061686 ).
akki

25

Perm spaceиспользуется для хранения информации о загруженных классах и некоторых других расширенных функциях, таких как String Pool(для высокооптимизированного тестирования равенства строк), которые обычно создаются String.intern()методами. По мере того, как ваше приложение (количество классов) будет расти, это пространство должно быстро заполняться, поскольку сборка мусора в этом пространстве не очень эффективна для очистки по мере необходимости, вы быстро получите ошибку Out of Memory: perm gen space. После этого ни одно приложение не будет эффективно работать на этой машине даже после огромной пустой JVM.

Перед запуском вашего приложения вы должны java -XX:MaxPermSizeизбавиться от этой ошибки.


Пул строк перемещается в пространство кучи с java 7.
Caffeine Coder

20

Простой (и упрощенный) ответ: именно здесь jvm хранит свои собственные бухгалтерские данные, а не ваши данные.


17

Perm Gen означает постоянное поколение, которое содержит информацию о метаданных о классах.

  1. Предположим, что если вы создаете имя класса A, его переменная экземпляра будет храниться в памяти кучи, а класс A вместе со статическими загрузчиками классов будет храниться в постоянной генерации.
  2. Сборщикам мусора будет сложно очистить или освободить пространство памяти, хранящееся в постоянной памяти поколения. Следовательно, всегда рекомендуется поддерживать настройки постоянной памяти до рекомендуемого предела.
  3. JAVA8 представила концепцию, называемую генерацией метапространства, поэтому permgen больше не требуется, когда вы используете версии jdk 1.8.

5

Пространство permgen - это область кучи, которая содержит все отражающие данные самой виртуальной машины, такие как объекты классов и методов.


3

Он содержит такие вещи, как определения классов, пул строк и т. Д. Я думаю, вы могли бы назвать это метаданными.


3

Пространство Permgen всегда известно как область метода. Когда подсистема загрузчика классов загружает файл класса (байт-код) в область метода (permGen). Он содержит все метаданные класса, например: полное имя вашего класса, полное имя непосредственного родительского класса, информацию о переменной, информацию о конструкторе, информацию о постоянном пуле и т. Д.


2

То, что существует в рамках PremGen: Class Area, входит в PremGen area. Статические поля также создаются во время загрузки класса, поэтому они также существуют в PremGen. Здесь хранится область постоянного пула, в которой хранятся все неизменяемые поля, объединенные в пул, как String. В дополнение к этому также находятся данные классов, загруженные загрузчиками классов, массивы объектов, внутренние объекты, используемые jvm.


1

PermGen Space означает выделение памяти для постоянной генерации. Все неизменяемые объекты Java подпадают под эту категорию, например те, Stringкоторые создаются с помощью литералов или String.intern()методов и для загрузки классов в память. PermGen Space ускоряет поиск равенства строк.


1
  • JVM имеет внутреннее представление объектов Java, и эти внутренние представления хранятся в куче (в молодом поколении или постоянном поколении).
  • JVM также имеет внутреннее представление классов Java, которые хранятся в постоянной генерации.

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.