Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit une vue d’ensemble des stratégies et paramètres recommandés pour la conteneurisation d’applications Java. Lorsque vous conteneurisez une application Java, examinez attentivement le temps processeur disponible par le conteneur. Ensuite, tenez compte de la quantité de mémoire disponible, en tenant compte à la fois de la quantité totale de mémoire et de la taille du tas de la machine virtuelle Java (JVM). Dans les environnements conteneurisés, les applications peuvent avoir accès à tous les processeurs et par conséquent être en mesure d’exécuter plusieurs threads en parallèle. Toutefois, il est courant que les conteneurs aient un quota d’unité centrale appliqué qui peut restreindre l’accès aux processeurs.
La machine virtuelle JVM utilise des heuristiques pour déterminer le nombre de « processeurs disponibles » en fonction du quota d’UC, ce qui peut considérablement influencer les performances des applications Java. La mémoire allouée au conteneur lui-même et la taille de la zone de tas pour la JVM sont aussi importantes que les processeurs. Ces facteurs déterminent le comportement du garbage collector (GC) et les performances globales du système.
Conseil / Astuce
Si vous ne souhaitez pas paramétrer ces paramètres manuellement, le lanceur de commandes Azure pour Java (jaz) applique automatiquement les valeurs par défaut de JVM natives cloud pour vous. Il s’agit d’un remplacement direct de la commande java qui détecte les limites du conteneur et sélectionne le dimensionnement du tas et les options du GC les mieux adaptés. Pour plus d’informations, consultez Ajuster automatiquement la machine virtuelle JVM avec le lanceur de commandes Azure pour Java.
Conteneuriser une nouvelle application
Lorsque vous conteneurisez une charge de travail Java pour une nouvelle application, tenez compte de deux éléments lors de la réflexion sur la mémoire :
- Mémoire allouée au conteneur lui-même.
- Quantité de mémoire disponible pour le processus Java.
Comprendre l’ergonomie par défaut de JVM
Les applications ont besoin d’un point de départ et d’un paramètre. La machine virtuelle JVM a une ergonomie par défaut avec des valeurs prédéfinies basées sur le nombre de processeurs disponibles et la quantité de mémoire dans le système. La machine virtuelle JVM utilise les valeurs par défaut indiquées dans les tableaux suivants lorsque vous la démarrez sans indicateurs de démarrage ou paramètres spécifiques.
Le tableau suivant présente le GC par défaut pour les ressources disponibles :
| Ressources disponibles | GC par défaut |
|---|---|
| Nombre quelconque de processeurs Jusqu’à 1 791 Mo de mémoire |
SerialGC |
| 2 processeurs ou plus 1 792 Mo ou plus de mémoire |
G1GC |
Le tableau suivant indique la taille maximale par défaut du tas en fonction de la quantité de mémoire disponible dans l’environnement où la machine virtuelle JVM est en cours d’exécution :
| Mémoire disponible | Taille de segment maximale par défaut |
|---|---|
| Jusqu’à 256 Mo | 50 % de la mémoire disponible |
| 256 Mo à 512 Mo | ~127 Mo |
| Plus de 512 Mo | 25 % de la mémoire disponible |
La taille du tas initial par défaut est de 1/64 de mémoire disponible. Ces valeurs sont valides pour OpenJDK 11 et versions ultérieures, et pour la plupart des distributions, notamment Build Microsoft d’OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK, etc.
Déterminer la mémoire du conteneur
Choisissez une quantité de mémoire de conteneur qui répond le mieux à votre charge de travail, en fonction des besoins de votre application et de ses modèles d’utilisation distinctifs. Par exemple, si votre application crée des graphiques d’objets volumineux, vous avez probablement besoin de plus de mémoire que nécessaire pour les applications avec de nombreux graphiques d’objets de petite taille.
Conseil / Astuce
Si vous ne savez pas combien de mémoire allouer, un bon point de départ est de 4 Go.
Déterminer la mémoire de tas JVM
Lorsque vous allouez de la mémoire au tas de la JVM, n’oubliez pas que la JVM a besoin de davantage de mémoire que la quantité allouée au tas de la JVM. Ne définissez pas la taille maximale du tas JVM à une valeur égale à la quantité de mémoire allouée au conteneur. Ce paramètre peut entraîner des erreurs de mémoire insuffisante du conteneur (OOM) et des blocages de conteneur.
Conseil / Astuce
Allouer 75 % de la mémoire du conteneur au tas JVM.
Sur OpenJDK 11 et versions ultérieures, définissez la taille du tas JVM de l’une des manières suivantes :
| Descriptif | Drapeau | Exemples |
|---|---|---|
| Valeur fixe | -Xmx |
-Xmx4g |
| Valeur dynamique | -XX:MaxRAMPercentage |
-XX:MaxRAMPercentage=75 |
Taille minimale ou initiale du tas
Si l’environnement garantit une certaine quantité de mémoire réservée à une instance JVM, telle que dans un conteneur, définissez la taille minimale du tas ou la taille initiale du tas sur la même taille que la taille maximale du tas. Ce paramètre indique à la machine virtuelle JVM qu’elle ne doit pas effectuer la tâche de libérer de la mémoire sur le système d’exploitation.
Pour définir une taille minimale de tas, utilisez -Xms pour les montants absolus ou -XX:InitialRAMPercentage pour les pourcentages.
Importante
Malgré ce que le nom suggère, l’indicateur -XX:MinRAMPercentage définit le pourcentage de RAM maximal par défaut pour les systèmes avec jusqu’à 256 Mo de RAM disponible dans le système.
Déterminer le GC à utiliser
Précédemment, vous avez déterminé la quantité de mémoire heap JVM de départ. L’étape suivante consiste à choisir votre GC. La quantité maximale de mémoire de tas JVM que vous avez souvent influence votre choix de GC. Le tableau suivant décrit les caractéristiques de chaque GC.
| Facteurs | SerialGC | ParallelGC | G1GC | ZGC | ShenandoahGC |
|---|---|---|---|---|---|
| Nombre de cœurs | 1 | 2 | 2 | 2 | 2 |
| Multithreaded | Non | Oui | Oui | Oui | Oui |
| Taille du tas Java | <4 Go | <4 Go | >4 Go | >4 Go | >4 Go |
| Suspendre | Oui | Oui | Oui | Oui (<1 ms) | Oui (<10 ms) |
| Traitement | Minimal | Minimal | Modéré | Modéré | Modéré |
| Effet de latence de queue | Élevé | Élevé | Élevé | Bas | Modéré |
| Version du JDK | Tous | Tous | JDK 8+ | JDK 17+ | JDK 11+ |
| Idéal pour | Petits tas monocœur | Segments de mémoire multicœurs ou charges de travail par lots avec n’importe quelle taille de tas | Réactif dans les tas de taille moyenne à grande (interactions requête-réponse/base de données) | Réactif dans les tas de taille moyenne à grande (interactions requête-réponse/base de données) | Réactif dans les tas de taille moyenne à grande (interactions requête-réponse/base de données) |
Conseil / Astuce
Pour la plupart des applications de microservice à usage général, commencez par le GC parallèle.
Déterminer le nombre de cœurs de CPU dont vous avez besoin
Pour tout GC autre que SerialGC, utilisez deux cœurs vCPU ou plus, ou au moins 2000m pour cpu_limit sur Kubernetes. Ne sélectionnez pas moins d’un cœur de processeur virtuel sur des environnements conteneurisés.
Conseil / Astuce
Si vous ne savez pas par combien de cœurs démarrer, un bon choix est deux cœurs vCPU.
Choisir un point de départ
Commencez par deux réplicas ou instances dans des environnements d’orchestration de conteneurs tels que Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps et Azure App Service. Le tableau suivant récapitule les points de départ recommandés pour la conteneurisation de votre nouvelle application Java.
| Cœurs de processeur virtuel | Mémoire du conteneur | Taille du tas JVM | GC | Répliques |
|---|---|---|---|---|
| 2 | 4 Go | 75 % | ParallelGC | 2 |
Utilisez les paramètres JVM suivants :
-XX:+UseParallelGC -XX:MaxRAMPercentage=75
Paramétrez automatiquement la machine virtuelle JVM avec le lanceur de commandes Azure pour Java
Les sections précédentes décrivent comment choisir manuellement des indicateurs JVM en fonction de la mémoire du conteneur, des cœurs de processeur et du type de charge de travail. Si vous ne souhaitez pas conserver ces paramètres vous-même, le lanceur de commandes Azure pour Java (jaz) applique automatiquement les valeurs par défaut de JVM natives cloud.
Le lanceur de commandes Azure pour Java est un utilitaire léger qui se trouve entre votre commande de démarrage et la machine virtuelle JVM. Il détecte l’environnement cloud, y compris les limites de mémoire et de CPU du conteneur, puis sélectionne les options de réglage les mieux adaptées pour la taille du tas, le choix du GC et les diagnostics. Cette approche réduit la surcharge liée à la configuration et améliore l’utilisation des ressources dès le départ.
Pour utiliser l’outil, remplacez la java commande par celle-ci jaz dans votre script de lancement ou dockerfile. Par exemple, au lieu de paramétrer manuellement les options JVM :
java -XX:+UseParallelGC -XX:MaxRAMPercentage=75 -jar myapp.jar
Utilisez jaz :
jaz -jar myapp.jar
L’outil est inclus dans les images de conteneur pour Build Microsoft d’OpenJDK, il n’est donc pas nécessaire d’effectuer de configuration supplémentaire. Le fichier Dockerfile suivant utilise jaz pour exécuter une application Java à partir d’un jar fichier :
# Use any Microsoft Build of OpenJDK base image
FROM mcr.microsoft.com/openjdk/jdk:25-ubuntu
# Add your application.jar
COPY application.jar /application.jar
# Use jaz to launch your Java application
CMD ["jaz", "-jar", "application.jar"]
Pour connaître les options d’installation, les environnements pris en charge et les détails de configuration, consultez Azure lanceur de commandes pour Java.
Conteneuriser une application locale existante
Si votre application s’exécute déjà localement ou sur une machine virtuelle dans le cloud, commencez par la configuration suivante :
- Quantité de mémoire à laquelle l’application a actuellement accès.
- Le même nombre de processeurs ou de cœurs de processeurs virtuels actuellement disponibles pour l’application.
- Les mêmes paramètres JVM que vous utilisez actuellement.
Si la combinaison de cœurs de processeur virtuel ou de mémoire de conteneur n’est pas disponible, choisissez la plus proche, arrondissez les cœurs de processeurs virtuels et la mémoire du conteneur.
Étapes suivantes
Maintenant que vous comprenez les recommandations générales pour la conteneurisation d’applications Java, passez aux articles suivants pour établir une base de référence de conteneurisation et simplifier le réglage de JVM :