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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

FYI: статья о Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

Ответ 4

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