Почему максимальная куча намного меньше значения, установленного в Xmx ( с -XX: + UseParallelGC -XX: + UseParallelOldGC)

Я запускаю SolrCloud на k8s со следующими настройками:

Параметры кучи:

-server -Xms280m -Xmx312m

Другие параметры:

-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -XX:ParallelGCThreads=4 -XX:AdaptiveSizePolicyOutputInterval=1 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:MaxGCPauseMillis=300 -XX:GCTimeRatio=19 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=128m -XX:MaxMetaspaceFreeRatio=90 -XX:MetaspaceSize=96m -XX:+ParallelRefProcEnabled

И максимальная куча, показанная на странице администратора, составляет только 277,5 м , что на 34,5 меньше Xmx

enter image description here

И если я изменю параметры кучи на

-server -Xms312m -Xmx312m

Тогда максимальная куча составляет около 300 м, что намного ближе к Xmx

У меня следующие вопросы:

  • Почему такая большая разница в первой настройке?
  • Почему разница становится меньше, когда я устанавливаю Xms = Xmx
  • Будет ли JVM по-прежнему учитывать мои настройки Xmx? (Может ли мое приложение по-прежнему вырасти до 312 м?)

Дополнительные наблюдения ...

Я пробовал это с другим параметром памяти:

-server -Xms296m -Xmx360m

и максимальная куча, показанная в пользовательском интерфейсе администратора Solr, составляет 320 м

После некоторых вычислений кажется, что максимальная куча всегда составляет около 90% установленного мной Xmx.

  312 * 0.9 = 280.8 (just 3.3m more than 277.5m)
  360 * 0.9 = 324  (just 4m more than 320m)

Почему это происходит?

0
задан 28 March 2020 в 19:01
1 ответ

Вот некоторые подробности.

-Xmx = максимальная куча java

-Xms = начальная и минимальная куча java

- Опция Xmx и опция -Xms в комбинации используются для ограничения размера кучи Java. Куча Java никогда не может быть больше, чем -Xmx . Кроме того, значение -Xms можно использовать как «минимальный размер кучи» для установки фиксированного размера кучи, установив -Xms = -Xmx .

Однако -Xmx не ограничивает общий объем памяти, который может использовать JVM.

Вот мой ответ в строке

Почему такая большая разница в первой настройке?

Это из-за разницы между начальной памятью и максимальной кучей памяти.

Почему разница становится меньше, когда я устанавливаю Xms = Xmx

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

Будет ли JVM по-прежнему соблюдать мои настройки Xmx? (Будет ли моя заявка разрешено вырасти до 312 м?)

Ответ - да, но не путайте с Xmx и JVM. Куча будет увеличиваться, когда приложению потребуется больше ресурсов.

РЕДАКТИРОВАТЬ 1:

Куча, состоящая из трех частей:

  1. Eden
  2. Survivor
  3. Tenured
  4. Зарезервировано

Согласно вашему снимку, она показывает 3 части до 195,13 МБ до 209,50 МБ до 277,50 МБ и остальное, если зарезервировано.

Надеюсь, это поможет.

0
ответ дан 30 March 2020 в 01:27

Теги

Похожие вопросы