Compartir vía


Uso eficaz de la memoria para aplicaciones Java en Azure Container Apps

La Máquina virtual Java (JVM) usa la memoria de forma conservadora, ya que supone que la memoria del sistema operativo debe compartirse entre varias aplicaciones. Sin embargo, la aplicación de contenedor puede optimizar el uso de la memoria y hacer que la mayor cantidad posible de memoria esté disponible para la aplicación. Esta optimización de memoria se conoce como ajuste automático de memoria de Java. Cuando se habilita el ajuste de memoria, el rendimiento de la aplicación Java suele mejorarse entre el 10 % y el 20 % sin cambios en el código.

Azure Container Apps proporciona un ajuste automático de memoria en las siguientes circunstancias:

  • Una sola aplicación Java se ejecuta en un contenedor.
  • La aplicación se implementa desde el código fuente o un archivo JAR.

El ajuste automático de memoria está habilitado de manera predeterminada, pero puede deshabilitarlo manualmente.

Deshabilitar el ajuste de memoria

El ajuste automático de memoria es útil en la mayoría de los escenarios, pero puede que no sea ideal para todas las situaciones. Puede deshabilitar el ajuste de memoria de manera manual o automática.

Deshabilitación manual

Para deshabilitar el ajuste de memoria al crear la aplicación de contenedor, establezca la variable de entorno BP_JVM_FIT en false.

En los ejemplos siguientes se muestra cómo usar la deshabilitación del ajuste de memoria con los comandos create, up y 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" 

Para comprobar que el ajuste de memoria está deshabilitado, compruebe los registros para ver el mensaje siguiente:

Deshabilitación del ajuste de memoria jvm, motivo: deshabilitado manualmente

Deshabilitación automática

El ajuste de memoria se deshabilita automáticamente cuando se cumple alguna de las condiciones siguientes:

  • Memoria de contenedor limitada: la memoria del contenedor es inferior a 1 GB.

  • Establecer explícitamente opciones de memoria: cuando se especifica una o varias opciones de memoria en las variables de entorno a través de JAVA_TOOL_OPTIONS. Las opciones de configuración de memoria incluyen los siguientes valores:

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

    Por ejemplo, el ajuste de memoria se deshabilita automáticamente si especifica el tamaño máximo de montón en una variable de entorno, como se muestra en el ejemplo siguiente:

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

    Con el ajuste de memoria deshabilitado, verá la siguiente salida del mensaje en el registro:

    Deshabilitación del ajuste de memoria jvm, motivo: use la configuración especificada en JAVA_TOOL_OPTIONS=-Xmx512m en su lugar Picked up JAVA_TOOL_OPTIONS: -Xmx512m

  • Tamaño pequeño de memoria sin montón: casos poco frecuentes cuando el tamaño calculado de montón o el tamaño sin montón es demasiado pequeño (menos de 200 MB).

Comprobar que el ajuste de memoria esté habilitado

Inspeccione el flujo de registro durante el inicio de un mensaje que haga referencia a la Configuración de memoria de JVM calculada.

Este es un ejemplo de salida de mensaje durante el inicio.

Configuración de memoria de JVM calculada: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M (Memoria total: 2G, Número de subprocesos: 250, Recuento de clases cargadas: 12 924, Capacidad de aumento: 0 %)

Picked up JAVA_TOOL_OPTIONS: -XX:MaxDirectMemorySize=10M -Xmx1498277K -XX:MaxMetaspaceSize=86874K -XX:ReservedCodeCacheSize=240M -Xss1M

Configuración del entorno en tiempo de ejecución

Puede establecer variables de entorno para que afecten al comportamiento del ajuste de memoria.

Variable Unidad Ejemplo Descripción
BPL_JVM_HEAD_ROOM Percentage BPL_JVM_HEAD_ROOM=5 Deje espacio de memoria para el sistema en función del porcentaje especificado.
BPL_JVM_THREAD_COUNT Número BPL_JVM_THREAD_COUNT=200 Número máximo estimado de subprocesos.
BPL_JVM_CLASS_ADJUSTMENT Número
Percentage
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Ajuste el recuento de clases de JVM por valor o porcentaje explícitos.

Nota:

El cambio de estas variables no deshabilita el ajuste automático de memoria.

Advertencia de memoria insuficiente

Si decide configurar las opciones de memoria usted mismo, corre el riesgo de encontrar una advertencia de memoria insuficiente.

Estas son algunas de las posibles razones por las que podría agotarse la memoria del contenedor:

  • La memoria de montón es mayor que la memoria total disponible.

  • La memoria sin montón es mayor que la memoria total disponible.

  • La memoria de montón + la memoria sin montón es mayor que la memoria total disponible.

Si el contenedor se queda sin memoria, se produce la siguiente advertencia:

Advertencia de OOM: la memoria de montón 1200M es mayor que 1G disponible para la asignación (-Xmx1200M)

Pasos siguientes