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

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

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

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

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

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

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

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

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

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

В 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

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

  • Что на самом деле делает флаг JVM CMSClassUnloadingEnabled?
  • Как отключить использование стека IPv6 для IPv4 IP на JRE?
  • Ошибка переполнения стека Java - как увеличить размер стека в Eclipse?
  • Как получить аргументы vm из java-приложения?
  • Как установить -Dorg.apache.el.parser.COERCE_TO_ZERO = false программно
  • Увеличение максимального размера кучи JVM для приложений с интенсивной памятью
  • Давайте будем гением компьютера.