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