Как определить идеальный размер метапространства для Java 8

Мы переносим наше веб-приложение с Java 7 на Java 8. Мы определили аргументы параметра PermSize jvm.

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

Мой вопрос: нужно ли мне определить наилучшие значения для моего веб-приложения для параметров metaspace jvm или по умолчанию будет хорошей идеей?

Обновление:

Подробнее о моем веб-приложении: Мое веб-приложение основано на фреймворках struts и spring. Обычно это занимает 4k запросов в минуту. Это приложение развернуто на tomcat 8.5 и не содержит никаких других веб-приложений. Но на одной виртуальной машине работает несколько экземпляров tomcat. Текущие значения -Xms и -Xmx установлены на 1g.


person Rishikesh Darandale    schedule 10.08.2017    source источник
comment
Поэтому я могу отредактировать свой ответ: насколько велико приложение и сколько пользователей его используют? У вас есть несколько приложений, работающих на одном сервере? Вы определенно хотите установить некоторый фиксированный потолок для памяти, если ваше приложение использует одну и ту же машину с другими приложениями, ЕСЛИ нехватка ресурсов является серьезной проблемой в целом.   -  person Wep0n    schedule 10.08.2017
comment
@ Wep0n, я обновил информацию о своем веб-приложении в своем вопросе.   -  person Rishikesh Darandale    schedule 10.08.2017


Ответы (3)


Здесь есть несколько вещей, которые вы можете рассмотреть:

  1. Начальный размер метапространства: видите ли вы отрицательное и измеримое влияние при запуске вашего приложения, потому что JVM должна изменить размер метапространства? Тогда вам, вероятно, следует установить минимальный размер. Тем не менее, я бы постарался избежать этого, потому что это будет настройка, о которой легко забыть, когда приложение разрастется. -XX:MetaspaceSize=<NNN>

  2. Максимальный размер метапространства: хотите ли вы, чтобы ваше приложение давало сбой, когда метапространство увеличивалось до определенного размера? Или вы хотите ограничить ресурсы, которые сервер берет в этом отношении? Тогда вам, вероятно, следует установить максимальный размер метапространства -XX:MaxMetaspaceSize=<NNN>

  3. Metaspace Free Ratio: вы загружаете много разных классов динамически? Затем вы могли бы определить свободное соотношение в метапространстве, чтобы всегда было достаточно места для новых классов, и в критических ситуациях не требовалось изменение размера. -XX:MinMetaspaceFreeRatio=<NNN> и -XX:MaxMetaspaceFreeRatio=<NNN>

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

person Absurd-Mind    schedule 10.08.2017
comment
-XX:MetaspaceSize не устанавливает начальный размер. Он устанавливает порог, который запускает сборку мусора при первом его превышении. - person Holger; 22.11.2017

Внедрение Metaspace было попыткой исправить проблемы с нехваткой памяти (IIRC) в Java, когда дело доходит до сборки мусора с помощью упомянутого динамического увеличения/распределения памяти.

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

person Wep0n    schedule 10.08.2017

Хольгер прав. Это четко задокументировано здесь, я можно просто процитировать его здесь.

-XX:MetaspaceSize=size Задает размер выделенного пространства метаданных класса, при котором вызовет сборку мусора при первом превышении. Этот порог для сборки мусора увеличивается или уменьшается в зависимости от объема используемых метаданных. Размер по умолчанию зависит от платформы.

прямая цитата, но курсив мой ;)

person Hearen    schedule 21.05.2019