Значение PermGen Space - PullRequest
       16

Значение PermGen Space

29 голосов
/ 10 февраля 2010

Какое значение имеет пространство PermGen в Java?

Ответы [ 4 ]

44 голосов
/ 10 февраля 2010

Пространство PermGen зарезервировано для долгосрочных объектов - в основном Class объектов, загруженных ClassLoader. PermGen не будет собирать мусор, кроме как при очень особых обстоятельствах (в частности, когда ClassLoader, который загрузил эти классы, выходит из области видимости).

Это оптимизация сборки мусора - если объекты, которые мы не ожидаем собирать мусором, хранятся отдельно, это сжимает пространство, в котором хранятся остальные объекты, что приводит к меньшему количеству работы для сборщика мусора.

8 голосов
/ 10 февраля 2010

PermGen специфичен для виртуальных машин, имеющих сборку мусора поколений.

Если вы используете, скажем, JRockit, «значимость PermGen» не существует, потому что у JRockit такого понятия нет.

Обычно несколько лет назад стали появляться странные ошибки «из пространства PermGen», и никто еще не знал, чья это ошибка (Tomcat + Hibernate + Sun VM использовалась для ее запуска), чтобы заменить одну компонента (в настоящее время проблемы понятны, но несколько лет назад, когда они начали обрезку, вряд ли можно было найти какую-либо информацию по этому вопросу). Вы можете заменить Tomcat на Resin или Sun VM на JRockIt и т. Д.

Я думаю, важно отметить, что PermGen не является частью спецификаций Java, а является лишь деталями реализации (вполне) некоторых виртуальных машин.

6 голосов
/ 10 февраля 2010

Единственное, что вам действительно нужно знать, это то, что пространство PermGen отделено от общей кучи и не подвержено влиянию параметра -Xmx VM. Если у вас есть приложение, которое загружает множество определений классов (например, сервер приложений или IDE), вы можете установить размер пространства PermGen с помощью опции -XX:MaxPermSize VM.

4 голосов
/ 10 февраля 2010

Постоянное поколение содержит метаданные, описывающие пользовательские классы (классы, которые не являются частью языка Java).

Приложения с большой кодовой базой могут заполнить этот сегмент кучи, что приведет к java.lang.OutOfMemoryError: PermGen. На это не влияет параметр -Xmx или объем памяти, который у вас есть на машине. Чтобы установить новый начальный размер, используйте -XX:PermSize=64m. Чтобы установить максимальный размер, используйте -XX:MaxPermSize=128m

...