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

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

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

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

Dockerfile

FROM jetty:9.4-jdk11

ENV APP_WAR root.war
ENV APP_EXPLODED_WAR root/
ENV APP_DESTINATION_PATH $JETTY_BASE/webapps/
ENV APP_DESTINATION_WAR $APP_DESTINATION_PATH$APP_WAR
ENV APP_DESTINATION_EXPLODED_WAR $APP_DESTINATION_PATH$APP_EXPLODED_WAR

ADD. $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

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

resources:
  limits:
    cpu: "8"
    memory: 60G
  requests:
    cpu: "6"
    memory: 60G

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

0
задан 14 October 2021 в 11:53
1 ответ

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

-XX:-UseCompressedOops
    
Disables the use of compressed pointers. By default, this option is enabled, and compressed pointers are used when Java heap sizes are less than 32 GB. When this option is enabled, object references are represented as 32-bit offsets instead of 64-bit pointers, which typically increases performance when running the application with Java heap sizes of less than 32 GB. This option works only for 64-bit JVMs.
    
It’s also possible to use compressed pointers when Java heap sizes are greater than 32 GB. See the -XX:ObjectAlignmentInBytes option.

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

Использовать -XX:ObjectAlignmentInBytesв моем случае тоже не рекомендуется, из той же документации .

-XX:ObjectAlignmentInBytes=alignment

Sets the memory alignment of Java objects (in bytes). By default, the value is set to 8 bytes. The specified value should be a power of 2, and must be within the range of 8 and 256 (inclusive). This option makes it possible to use compressed pointers with large Java heap sizes.

The heap size limit in bytes is calculated as:

4GB * ObjectAlignmentInBytes

Note:

As the alignment value increases, the unused space between objects also increases. As a result, you may not realize any benefits from using compressed pointers with large Java heap sizes.

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

0
ответ дан 18 October 2021 в 08:30

Теги

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