Partage via


Utiliser la mémoire efficacement pour les applications Java dans Azure Container Apps

La machine virtuelle Java (JVM) utilise la mémoire de manière conservatrice, car elle suppose que la mémoire du système d’exploitation doit être partagée entre plusieurs applications. Toutefois, votre application conteneur peut optimiser l’utilisation de la mémoire et rendre la quantité maximale de mémoire possible pour votre application. Cette optimisation de la mémoire est appelée ajustement automatique de la mémoire Java. Lorsque l’ajustement de la mémoire est activé, les performances des applications Java sont généralement améliorées entre 10 % et 20 % sans aucune modification du code.

Azure Container Apps fournit un ajustement automatique de la mémoire dans les circonstances suivantes :

  • Une seule application Java s’exécute dans un conteneur.
  • Votre application est déployée à partir du code source ou d’un fichier JAR.

L’ajustement automatique de la mémoire est activé par défaut, mais vous pouvez le désactiver manuellement.

Désactiver l’ajustement de la mémoire

L’ajustement automatique de la mémoire est utile dans la plupart des scénarios, mais il peut ne pas être idéal pour toutes les situations. Vous pouvez désactiver l’ajustement de la mémoire manuellement ou automatiquement.

Désactivation manuelle

Pour désactiver l’ajustement de la mémoire lorsque vous créez votre application conteneur, définissez la variable d’environnement BP_JVM_FIT sur false.

Les exemples suivants vous montrent comment utiliser la désactivation de l’ajustement de la mémoire avec les commandes create, upet 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" 

Pour vérifier que l’ajustement de la mémoire est désactivé, vérifiez vos journaux d’activité pour le message suivant :

Désactivation de l’ajustement de la mémoire jvm, raison : désactivé manuellement

Désactivation automatique

L’ajustement de la mémoire est automatiquement désactivé lorsque l’une des conditions suivantes est remplie :

  • Mémoire de conteneur limitée: la mémoire du conteneur est inférieure à 1 Go.

  • Définir explicitement les options de mémoire: quand un ou plusieurs paramètres de mémoire sont spécifiés dans les variables d’environnement via JAVA_TOOL_OPTIONS. Les options de paramètre de mémoire incluent les valeurs suivantes :

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

    Par exemple, l’ajustement de la mémoire est automatiquement désactivé si vous spécifiez la taille maximale du tas dans une variable d’environnement, comme illustré dans l’exemple suivant :

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

    Une fois l’ajustement de la mémoire désactivé, la sortie du message suivant s’affiche dans le journal :

    Désactivation de l’ajustement de la mémoire jvm, raison : utilisez les paramètres spécifiés dans JAVA_TOOL_OPTIONS=-Xmx512m à la place picked JAVA_TOOL_OPTIONS : -Xmx512m

  • Petite taille de mémoire non tas: rares cas lorsque la taille calculée du tas ou de la taille non-tas est trop petite (moins de 200 Mo).

Vérifier que l’ajustement de la mémoire est activé

Inspectez votre flux de journal pendant le démarrage d’un message qui fait référence à Configuration de mémoire JVM calculée.

Voici un exemple de sortie de message lors du démarrage.

Configuration de la mémoire JVM calculée : -XX :MaxDirectMemorySize=10M -Xmx1498277K -XX :MaxMetaspaceSize=86874K -XX :ReservedCodeCacheSize=240M -Xss1M (Mémoire totale : 2G, Nombre de threads : 250, Nombre de classes chargées : 12924, Headroom : 0 %)

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

Configuration du runtime

Vous pouvez définir des variables d’environnement pour affecter le comportement d’ajustement de la mémoire.

Variable Unité Exemple Description
BPL_JVM_HEAD_ROOM Percentage BPL_JVM_HEAD_ROOM=5 Laissez l’espace mémoire pour le système en fonction du pourcentage donné.
BPL_JVM_THREAD_COUNT Nombre BPL_JVM_THREAD_COUNT=200 Nombre maximal estimé de threads.
BPL_JVM_CLASS_ADJUSTMENT Nombre
Percentage
BPL_JVM_CLASS_ADJUSTMENT=10000
BPL_JVM_CLASS_ADJUSTMENT="10%"
Ajustez le nombre de classes JVM par valeur ou pourcentage explicite.

Remarque

La modification de ces variables ne désactive pas l’ajustement automatique de la mémoire.

Avertissement de mémoire insuffisante

Si vous décidez de configurer vous-même les paramètres de mémoire, vous risquez de rencontrer un avertissement hors mémoire.

Voici quelques raisons possibles pour lesquelles votre conteneur peut manquer de mémoire :

  • La mémoire du tas est supérieure à la mémoire totale disponible.

  • La mémoire non-tas est supérieure à la mémoire totale disponible.

  • La mémoire tas + non-tas est supérieure à la mémoire totale disponible.

Si votre conteneur manque de mémoire, vous rencontrez l’avertissement suivant :

Avertissement OOM : la mémoire du tas 1200M est supérieure à 1G disponible pour l’allocation (-Xmx1200M)

Étapes suivantes