-XX: MaxPermSize с или без -XX: PermSize - PullRequest
50 голосов
/ 02 декабря 2011

Мы столкнулись с ошибкой Java.lang.OutOfMemoryError: Пробел PermGen и, глядя на параметры JVM tomcat, кроме параметров -Xms и -Xmx, мы также указываем -XX:MaxPermSize=128m. После небольшого профилирования я вижу, что иногда происходит сборка мусора в пространстве PermGen, что не позволяет ему работать полностью.

Мой вопрос: кроме увеличения -XX:MaxPermSize, в чем будет разница, если я укажу также -XX:PermSize? Я знаю, что тогда общая память будет Xmx + maxPermSize , но есть ли другая причина, по которой -XX:PermSize должен не быть там, когда указан -XX:MaxPermSize?

Пожалуйста, поделитесь, если у вас есть реальный опыт работы с этими параметрами JVM.

пс. JVM является 64-битной серверной виртуальной машиной HotSpot, сборка 16.2-b04

Ответы [ 3 ]

44 голосов
/ 02 декабря 2011

-XX:PermSize указывает начальный размер, который будет выделен во время запуска JVM.При необходимости JVM выделит до -XX:MaxPermSize.

25 голосов
/ 02 декабря 2011

Играя с параметрами, такими как -XX:PermSize и -Xms, вы можете настроить производительность, например, запуска вашего приложения. Я не смотрел на это недавно, но несколько лет назад значение по умолчанию -Xms было что-то вроде 32 МБ (я думаю), если вашему приложению требовалось намного больше, чем оно вызывало бы несколько циклов заполнения памяти - полный сборщик мусора - увеличьте объем памяти и т. д., пока не загрузите все необходимое. Этот цикл может отрицательно сказаться на производительности запуска, поэтому немедленное назначение требуемого номера может улучшить запуск.

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

ПРЕДУПРЕЖДЕНИЕ JVM обладает большой оптимизацией и интеллектом, когда речь идет о распределении памяти, разделении пространства eden и старших поколений, и т.д. или -XX:PermSize равно -XX:MaxPermSize, поскольку это удалит некоторые из оптимизаций, которые JVM может применить к своим стратегиям распределения, и тем самым снизит производительность вашего приложения вместо ее улучшения.

Как всегда: выполните нетривиальные измерения, чтобы доказать, что ваши изменения действительно улучшают производительность в целом (например, увеличение времени запуска может иметь катастрофические последствия для производительности во время использования приложения)

7 голосов
/ 02 декабря 2011

Если вы выполняете некоторую настройку производительности, часто рекомендуется установить для -XX:PermSize и -XX:MaxPermSize одинаковое значение, чтобы повысить эффективность JVM.

Вот некоторая информация:

  1. Поддержка кучи больших страниц на платформах x86 и amd64
  2. Поддержка Java для страниц с большой памятью
  3. НастройкаРазмер постоянного поколения

Вы также можете указать -XX:+CMSClassUnloadingEnabled, чтобы включить опцию выгрузки класса, если вы используете CMS GC.Это может помочь уменьшить вероятность Java.lang.OutOfMemoryError: PermGen space

...