Изучая профилирование памяти Java, я все время встречаю термин «постоянное пространство» в дополнение к «куче». Я знаю, что такое куча - что такое пермское пространство?
Постоянная генерация является особенной, потому что она содержит метаданные, описывающие пользовательские классы (классы, не являющиеся частью языка 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избавиться от этой ошибки.
Perm Gen означает постоянное поколение, которое содержит информацию о метаданных о классах.
Предположим, что если вы создаете имя класса A, его переменная экземпляра будет храниться в памяти кучи, а класс A вместе со статическими загрузчиками классов будет храниться в постоянной генерации.
Сборщикам мусора будет сложно очистить или освободить пространство памяти, хранящееся в постоянной памяти поколения. Следовательно, всегда рекомендуется поддерживать настройки постоянной памяти до рекомендуемого предела.
JAVA8 представила концепцию, называемую генерацией метапространства, поэтому permgen больше не требуется, когда вы используете версии jdk 1.8.
Пространство Permgen всегда известно как область метода. Когда подсистема загрузчика классов загружает файл класса (байт-код) в область метода (permGen). Он содержит все метаданные класса, например: полное имя вашего класса, полное имя непосредственного родительского класса, информацию о переменной, информацию о конструкторе, информацию о постоянном пуле и т. Д.
То, что существует в рамках PremGen: Class Area, входит в PremGen area. Статические поля также создаются во время загрузки класса, поэтому они также существуют в PremGen. Здесь хранится область постоянного пула, в которой хранятся все неизменяемые поля, объединенные в пул, как String. В дополнение к этому также находятся данные классов, загруженные загрузчиками классов, массивы объектов, внутренние объекты, используемые jvm.
PermGen Space означает выделение памяти для постоянной генерации. Все неизменяемые объекты Java подпадают под эту категорию, например те, Stringкоторые создаются с помощью литералов или String.intern()методов и для загрузки классов в память. PermGen Space ускоряет поиск равенства строк.
Ответы:
Это означает постоянное поколение :
источник
Perm space
используется для хранения информации о загруженных классах и некоторых других расширенных функциях, таких какString Pool
(для высокооптимизированного тестирования равенства строк), которые обычно создаютсяString.intern()
методами. По мере того, как ваше приложение (количество классов) будет расти, это пространство должно быстро заполняться, поскольку сборка мусора в этом пространстве не очень эффективна для очистки по мере необходимости, вы быстро получите ошибку Out of Memory: perm gen space. После этого ни одно приложение не будет эффективно работать на этой машине даже после огромной пустой JVM.Перед запуском вашего приложения вы должны
java -XX:MaxPermSize
избавиться от этой ошибки.источник
Простой (и упрощенный) ответ: именно здесь jvm хранит свои собственные бухгалтерские данные, а не ваши данные.
источник
Perm Gen означает постоянное поколение, которое содержит информацию о метаданных о классах.
источник
Пространство permgen - это область кучи, которая содержит все отражающие данные самой виртуальной машины, такие как объекты классов и методов.
источник
Он содержит такие вещи, как определения классов, пул строк и т. Д. Я думаю, вы могли бы назвать это метаданными.
источник
Пространство Permgen всегда известно как область метода. Когда подсистема загрузчика классов загружает файл класса (байт-код) в область метода (permGen). Он содержит все метаданные класса, например: полное имя вашего класса, полное имя непосредственного родительского класса, информацию о переменной, информацию о конструкторе, информацию о постоянном пуле и т. Д.
источник
То, что существует в рамках PremGen: Class Area, входит в PremGen area. Статические поля также создаются во время загрузки класса, поэтому они также существуют в PremGen. Здесь хранится область постоянного пула, в которой хранятся все неизменяемые поля, объединенные в пул, как String. В дополнение к этому также находятся данные классов, загруженные загрузчиками классов, массивы объектов, внутренние объекты, используемые jvm.
источник
PermGen Space означает выделение памяти для постоянной генерации. Все неизменяемые объекты Java подпадают под эту категорию, например те,
String
которые создаются с помощью литералов илиString.intern()
методов и для загрузки классов в память. PermGen Space ускоряет поиск равенства строк.источник
источник