Ответ 1
-XX:PermSize
указывает начальный размер, который будет выделен при запуске JVM. При необходимости JVM будет выделять до -XX:MaxPermSize
.
Мы столкнулись с ошибкой Java.lang.OutOfMemoryError: PermGen space и рассмотрим параметры JVM tomcat, кроме параметров -Xms
и -Xmx
, которые мы также указываем -XX:MaxPermSize=128m
, После небольшого профилирования я иногда вижу сборку мусора на пространстве PermGen, экономя ее от полной работы.
Мой вопрос: кроме увеличения -XX:MaxPermSize
какая разница, если я также укажу -XX:PermSize
? Я знаю, что общая память тогда будет Xmx + maxPermSize, но есть ли другая причина, почему -XX:PermSize
должен не быть там, когда указан -XX:MaxPermSize
?
Пожалуйста, поделитесь, если у вас есть реальный опыт работы с этими параметрами JVM.
пс. JVM - это серверная VM-версия HotSpot 64-бит 16.2-b04
-XX:PermSize
указывает начальный размер, который будет выделен при запуске JVM. При необходимости JVM будет выделять до -XX:MaxPermSize
.
Играя с параметрами -XX:PermSize
и -Xms
, вы можете настроить производительность - например, запуск вашего приложения. Я не смотрел на него недавно, но несколько лет назад значение по умолчанию -Xms
было чем-то вроде 32 МБ (я думаю), если вашему приложению потребовалось намного больше, чем это вызвало бы несколько циклов заполнения памяти - полный сбор мусора - увеличить память и т.д., пока он не загрузил все необходимое. Этот цикл может быть вредным для производительности при запуске, поэтому немедленное присвоение необходимого номера может улучшить запуск.
Аналогичный цикл применяется к постоянному поколению. Таким образом, настройка этих параметров может улучшить запуск (в частности).
ПРЕДУПРЕЖДЕНИЕ JVM имеет много оптимизаций и интеллекта, когда речь идет о распределении памяти, разделении пространства и старых поколений и т.д., поэтому не делайте таких действий, как -Xms
, равный -Xmx
или -XX:PermSize
, равным -XX:MaxPermSize
, поскольку он удалит некоторые из оптимизаций, которые JVM может применить к его стратегиям распределения, и для этого снижать производительность вашего приложения, а не улучшать его.
Как всегда: сделайте нетривиальные измерения, чтобы доказать, что ваши изменения фактически улучшают производительность в целом (например, улучшение времени запуска может быть катастрофическим для производительности во время использования приложения)
Если вы выполняете некоторую настройку производительности, часто рекомендуется установить для обоих значений -XX:PermSize
и -XX:MaxPermSize
то же значение, чтобы повысить эффективность JVM
.
Вот некоторая информация:
Вы также можете указать -XX:+CMSClassUnloadingEnabled
, чтобы включить разгрузку классов
если вы используете CMS
GC
. Это может помочь уменьшить вероятность Java.lang.OutOfMemoryError: PermGen space