Рейтинг:0

Большая куча Java в контейнерной среде

флаг uy

Я пытаюсь запустить веб-сервер Jetty на kubernetes, ему требуется чрезвычайно огромное количество кучи ~ 250 ГБ в нашей производственной среде, ~ 50 ГБ в нашей тестовой среде.

я использую причал: 9.4-jdk11, я стараюсь не устанавливать Xms или же Хмкс флаги явно, потому что значение отличается в разных средах, для этого я думал, что в зависимости от -XX:MaxRAMPercentage -XX:НачальныйRAMPercentage было бы намного лучше, но как бы я ни пытался, я не могу получить MaxHeapSize чтобы пройти 32178700288 ~ 30 Гб.

Узел, на котором установлено только приложение Java с несколькими крошечными сидкарами, имеет 64 ГБ памяти.

Докерфайл

ОТ пристани: 9.4-jdk11

ENV APP_WAR root.war
ENV APP_EXPLODED_WAR корень/
ENV APP_DESTINATION_PATH $JETTY_BASE/веб-приложения/
ENV APP_DESTINATION_WAR $APP_DESTINATION_PATH$APP_WAR
ENV APP_DESTINATION_EXPLODED_WAR $APP_DESTINATION_PATH$APP_EXPLODED_WAR

ДОБАВЛЯТЬ . $APP_DESTINATION_EXPLODED_WAR

ENV JAVA_OPTIONS -XX:+PrintFlagsFinal -XX:MaxRAMPercentage=90 -XX:InitialRAMPercentage=90 -XX:-OmitStackTraceInFastThrow -XX:+UseStringDeduplication -Xlog:gc*,stringdedup*=debug:file=/tmp/gc.log:time

Настройки ресурсов контейнера

Ресурсы:
  пределы:
    процессор: "8"
    память: 60G
  Запросы:
    процессор: "6"
    память: 60G

Исходя из этих значений, я должен получить 90% от 60 ГБ. MaxHeapSize ~ 54 ГБ, а не 30 ГБ. Любая идея, что мне не хватает?

флаг in
Подтвердили ли вы, что переменная среды JAVA_OPTIONS действительно применяется (то есть видите ли вы вывод этого PrintFlagsFinal в журналах)?
флаг uy
Да, я вижу это и могу подтвердить, что оно применяется.
Рейтинг:0
флаг uy

Аргумент JVM, называемый -XX:+UseCompressedOops которая включена по умолчанию в Java 11, является причиной, из-за документация.

-XX:-UseCompressedOops
    
Отключает использование сжатых указателей. По умолчанию этот параметр включен, и сжатые указатели используются, когда размер кучи Java меньше 32 ГБ. Когда этот параметр включен, ссылки на объекты представляются как 32-битные смещения вместо 64-битных указателей, что обычно повышает производительность при запуске приложения с размером кучи Java менее 32 ГБ. Этот вариант работает только для 64-битных JVM.
    
Также можно использовать сжатые указатели, когда размер кучи Java превышает 32 ГБ. См. параметр -XX:ObjectAlignmentInBytes.

Просто меняю -ХХ:+ к -ХХ:- как показано выше, отключит его.

С использованием -XX:ВыравниваниеОбъектаВБайтах не рекомендуется и в моем случае, из того же документация.

-XX:ObjectAlignmentInBytes=выравнивание

Устанавливает выравнивание памяти объектов Java (в байтах). По умолчанию установлено значение 8 байт. Указанное значение должно быть степенью числа 2 и должно находиться в диапазоне от 8 до 256 (включительно). Эта опция позволяет использовать сжатые указатели с большими размерами кучи Java.

Ограничение размера кучи в байтах рассчитывается как:

4 ГБ * объектное выравнивание в байтах

Примечание:

По мере увеличения значения выравнивания неиспользуемое пространство между объектами также увеличивается. В результате вы можете не получить никаких преимуществ от использования сжатых указателей с большими размерами кучи Java.

Но, думаю, стоит протестировать.

Ответить или комментировать

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