Назад | Перейти на главную страницу

Почему максимальная куча намного меньше значения, которое я установил в 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

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

-server -Xms312m -Xmx312m

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

Мои вопросы таковы:

Больше наблюдений ...

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

-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)

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

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

-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. Оставшийся в живых
  3. Сдержанный
  4. Зарезервированный

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

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