it-roy-ru.com

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

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

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

232
Geoff

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

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

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

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

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

249
Denys Séguret

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

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

83
stones333

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

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

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

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

43
AndrewBourgeois