Что такое перманентное пространство?
Изучая профилирование java-памяти, я продолжаю видеть термин «perm space» в дополнение к «куче». Я знаю, что такое куча – что такое пространство?
- Каков ваш любимый инструмент профилирования (для C ++)
- Действительный профиль подготовки для этого исполняемого файла не найден ... (опять же)
- Что такое простой прокси-сервер C ++ (VC ++)?
- Какие счетчики perfmon полезны для выявления узких мест ASP.NET?
- Инструменты профилирования Delphi
- Инструменты анализа профилировщика и памяти для Delphi
- Является ли MATLAB OOP медленным, или я делаю что-то неправильно?
- Время выполнения функции измерения в R
Он означает постоянное поколение :
Постоянное поколение является особенным, поскольку оно содержит метаданные, описывающие classы пользователей (classы, которые не являются частью языка Java). Примерами таких метаданных являются объекты, описывающие classы и методы, и они хранятся в постоянном поколении. Приложения с большой базой кода могут быстро заполнить этот сегмент кучи, который вызовет
java.lang.OutOfMemoryError
: PermGen независимо от того, насколько высока ваша -Xmx и сколько памяти у вас на машине.
Perm space
используется для хранения информации для загруженных classов и нескольких других дополнительных функций, таких как String Pool
(для высоко оптимизированного тестирования равенства строк), которые обычно создаются методами String.intern()
. По мере того, как ваше приложение (количество classов) будет расти, это пространство должно быть заполнено быстро, так как assembly мусора на этом Пространстве не очень эффективна для очистки по мере необходимости, вы быстро получаете память из памяти: perm gen space error. После этого никакая заявка не будет работать на этой машине эффективно даже после огромной пустой JVM.
Перед запуском приложения вам необходимо java -XX:MaxPermSize
чтобы избавиться от этой ошибки.
Простой (и упрощенный) ответ: именно там jvm хранит свои собственные бухгалтерские данные, а не ваши данные.
Perm Gen – это постоянное поколение, которое содержит метаданные о classах.
- Предположим, что если вы создадите имя classа A, переменная-экземпляр будет храниться в кучной памяти, а class A вместе со статическими загрузчиками classов будет храниться в постоянном поколении.
- Сборщикам мусора будет трудно очистить или освободить пространство памяти, хранящееся в памяти постоянного поколения. Следовательно, всегда рекомендуется сохранить настройки памяти пермг до рекомендуемого предела.
- JAVA8 представила концепцию, называемую генерацией метапространства, поэтому для использования версий jdk 1.8 больше не требуется.
Предельное пространство – это область кучи, которая содержит все отражающие данные самой виртуальной машины, такие как объекты classа и метода.
Область Permgen всегда известна как область метода. Когда подсистема classloader загружает файл classа (байтовый код) в область метода (permGen). Он содержит все метаданные classа, например: Полноценное имя вашего classа, Полноценное имя ближайшего родительского classа, информация о переменной, информация о конструкторе, постоянная информация о пуле и т. Д.
Он содержит такие вещи, как определения classов, пул строк и т. Д. Я думаю, вы могли бы назвать это метаданные.
Что существует в PremGen: Class Area входит в зону PremGen. Статические поля также разрабатываются при загрузке classов, поэтому они также существуют в PremGen. Здесь хранится область с постоянным пулом, имеющая все неизменяемые поля, которые объединены как String. В дополнение к этому, также хранятся данные classа, загруженные загрузчиками classов, массивы объектов, внутренние объекты, используемые jvm.
PermGen Space обозначает выделение памяти для постоянного поколения. Все неизменные объекты Java относятся к этой категории, например String
которая создается с помощью литералов или с String.intern()
методов String.intern()
и для загрузки classов в память. PermGen Space ускоряет поиск по строкам.