Что делает -XX: MaxPermSize?

260

В частности, почему это поможет исправить проблему PermGen OutOfMemoryError?

Кроме того, бонусные баллы за ответ, который указывает мне на документацию по аргументам JVM ...

Geoff
источник
mark.koli.ch/2009/01/…
Пол Томблин
6
oracle.com/technetwork/java/javase/tech/… Как вы дадите мне эти бонусные очки сейчас? :)
Денис Сегюре
1
@PaulTomblin Я не уверен, что парень, на статью которого вы ссылаетесь (первый результат Google), имеет какое-то представление о том, о чем он говорит.
Денис Сегюре
@Dystroy Я мог бы отправить вам печенье? Или вы могли бы просто получить удовлетворение в вопросе с хорошим ответом;)
Джефф
5
Это не дает конкретного ответа на этот вопрос, но если вы смотрите на управление памятью JVM, то лучшие статьи, которые я прочитал, - это и эта ссылка на infoq
Abe

Ответы:

274

Постоянное пространство - это место, где классы, методы, интернализованные строки и подобные объекты, используемые ВМ, хранятся и никогда не освобождаются (отсюда и название).

В этой статье Oracle кратко представлены работа и параметризация GC HotSpot и советуется увеличить это пространство, если вы загружаете много классов (это обычно имеет место для серверов приложений и некоторых IDE, таких как Eclipse):

Постоянное поколение не оказывает заметного влияния на производительность сборщика мусора для большинства приложений. Однако некоторые приложения динамически генерируют и загружают много классов; например, некоторые реализации страниц JavaServer Pages (JSP). Этим приложениям может потребоваться большее постоянное поколение для хранения дополнительных классов. Если это так, максимальный размер постоянной генерации можно увеличить с помощью параметра командной строки -XX: MaxPermSize =.

Обратите внимание, что в этой другой документации Oracle перечислены другие аргументы HotSpot.

Обновление: Начиная с Java 8, пространство permgen и этот параметр исчезли. Модель памяти, используемая для загруженных классов и методов, отличается и не ограничена (с настройками по умолчанию). Вы не должны больше видеть эту ошибку.

Денис Сегюре
источник
93

-XX:PermSize -XX:MaxPermSize используются для установки размера для постоянного поколения.

Постоянное поколение: постоянное поколение - это место, где хранятся файлы классов. Это результат скомпилированных классов и страниц JSP. Если это пространство заполнено, запускается полная сборка мусора. Если полная сборка мусора не может очистить старые классы, на которые нет ссылок, и не осталось места для расширения постоянного пространства, выдается ошибка нехватки памяти (OOME), и JVM падает.

stones333
источник
48

В Java 8 этот параметр обычно используется для печати предупреждающего сообщения, подобного этому:

Предупреждение о виртуальной машине на 64-разрядном сервере Java HotSpot (TM): игнорирование параметра MaxPermSize = 512m; поддержка была удалена в 8.0

Причина, по которой вы получаете это сообщение в Java 8, заключается в том, что Permgen был заменен Metaspace для устранения некоторых недостатков PermGen (как вы могли убедиться сами, одним из этих недостатков является то, что он имеет фиксированный размер).

К вашему сведению: статья о Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

AndrewBourgeois
источник
6
Смотрите также: Устранение PermGen в JDK 8 (стековерсия)
будет