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


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

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

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

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

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

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

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

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

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

В следующих примерах показано, как отключить настройку памяти с помощью команд create, up и 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

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

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

«Переменная» Единица измерения Пример Описание
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)

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