Поделиться через


Эффективное использование памяти для приложений Java в приложениях контейнеров Azure

Виртуальная машина Java (JVM) использует память консервативно, так как предполагается, что память ОС должна быть предоставлена нескольким приложениям. Однако приложение-контейнер может оптимизировать использование памяти и сделать максимальный объем памяти доступным для приложения. Эта оптимизация памяти называется автоматической установкой памяти Java. Если включена настройка памяти, производительность приложений Java обычно улучшается в диапазоне от 10% до 20 % без каких-либо изменений кода.

Приложения контейнеров Azure обеспечивают автоматическую настройку памяти в следующих случаях:

  • Одно приложение Java выполняется в контейнере.
  • Приложение развертывается из исходного кода или JAR-файла.

Автоматическая настройка памяти включена по умолчанию, но вы можете отключить вручную.

Отключение крепления памяти

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

Отключение вручную

Чтобы отключить настройку памяти при создании приложения-контейнера, задайте для переменной BP_JVM_FIT среды значение false.

В следующих примерах показано, как отключить настройку памяти с createupпомощью команд и update команд.

az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --image <CONTAINER_IMAGE_LOCATION> \
  --environment <ENVIRONMENT_NAME> \
  --env-vars BP_JVM_FIT="false" 

Чтобы убедиться, что настройка памяти отключена, проверка журналы для следующего сообщения:

Отключение крепления памяти jvm, причина: отключение памяти вручную

Автоматическое отключение

Настройка памяти автоматически отключается при выполнении любого из следующих условий:

  • Ограниченная память контейнера: объем памяти контейнера меньше 1 ГБ.

  • Явно задать параметры памяти: если один или несколько параметров памяти указываются в переменных среды.JAVA_TOOL_OPTIONS Параметры параметров памяти включают следующие значения:

    • -XX:MaxRAMPercentage
    • -XX:MinRAMPercentage
    • -XX:InitialRAMPercentage
    • -XX:MaxMetaspaceSize
    • -XX:MetaspaceSize
    • -XX:ReservedCodeCacheSize
    • -XX:MaxDirectMemorySize
    • -Xmx
    • -Xms
    • -Xss

    Например, настройка памяти автоматически отключается, если указать максимальный размер кучи в переменной среды, как показано в следующем примере:

    az containerapp update \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --image <CONTAINER_IMAGE_LOCATION>  \
      --set-env-vars JAVA_TOOL_OPTIONS="-Xmx512m" 
    

    При отключенной настройке памяти в журнал отображаются следующие выходные данные сообщения:

    Отключение параметров памяти jvm, причина: используйте параметры, указанные в JAVA_TOOL_OPTIONS=-Xmx512m, а не выбраны JAVA_TOOL_OPTIONS: -Xmx512m

  • Небольшой размер памяти, отличной от кучи: редкие случаи, когда вычисляемый размер кучи или негепа слишком мал (менее 200 МБ).

Проверка соответствия памяти включена

Проверьте поток журналов во время запуска сообщения, которое ссылается на вычисляемую конфигурацию памяти JVM.

Ниже приведен пример выходных данных сообщений во время запуска.

Вычисляемая конфигурация памяти JVM: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (общая память: 2G, число потоков: 250, число загруженных классов: 12924, головной зал: 0%)

Взял JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M

Конфигурация среды выполнения

Вы можете задать переменные среды, чтобы повлиять на поведение параметров памяти.

«Переменная» Unit Пример Description
BPL_JVM_HEAD_ROOM Процентное отношение BPL_JVM_HEAD_ROOM=5 Оставьте пространство памяти для системы на основе заданного процента.
BPL_JVM_THREAD_COUNT Число BPL_JVM_THREAD_COUNT=200 Предполагаемое максимальное количество потоков.
BPL_JVM_CLASS_ADJUSTMENT Число
Процентное отношение
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Настройте число классов JVM по явному значению или проценту.

Примечание.

Изменение этих переменных не отключает автоматическую установку памяти.

Предупреждение об нехватке памяти

Если вы решите самостоятельно настроить параметры памяти, вы рискуете столкнуться с предупреждением о нехватке памяти.

Ниже приведены некоторые возможные причины того, почему контейнер может выбежать из памяти:

  • Объем памяти кучи превышает общую доступную память.

  • Негеапная память больше общей доступной памяти.

  • Кучи и негеапная память больше общей доступной памяти.

Если контейнер не хватает памяти, возникает следующее предупреждение:

Предупреждение OOM: кучи памяти 1200M больше 1G, доступной для выделения (-Xmx1200M)

Следующие шаги