Paramètres -Xms et -Xmx au démarrage de la JVM
Les paramètres -Xms et -Xmx contrôlent respectivement la taille initiale et la taille maximale du tas (heap) Java au démarrage de la JVM. Ils figurent parmi les options les plus utilisées pour ajuster la consommation mémoire d'une application.
Syntaxe et exemples
java -Xms512m -Xmx2g MonApplication
-Xms512m: la JVM alloue dès le démarrage 512 Mo de tas.-Xmx2g: elle pourra en utiliser jusqu'à 2 Go si nécessaire.
Les unités acceptées sont k (kilo), m (méga) et g (giga), insensibles à la casse.
Valeurs par défaut
Depuis Java 8, les valeurs par défaut dépendent de la machine :
-Xms: environ 1/64e de la RAM physique, minimum 8 Mo.-Xmx: environ 1/4 de la RAM physique, plafonné à 256 Mo sur JVM 32 bits.
Pour vérifier les valeurs effectives :
java -XX:+PrintFlagsFinal -version | grep -E "InitialHeapSize|MaxHeapSize"
Comment les choisir ?
Application serveur en production
Définissez -Xms égal à -Xmx. La JVM évite alors de redimensionner le tas dynamiquement, ce qui :
- réduit les pauses du garbage collector liées à l'expansion ;
- expose immédiatement une éventuelle
OutOfMemoryErrorau démarrage plutôt qu'en charge ; - rend le comportement plus prévisible pour le monitoring.
java -Xms4g -Xmx4g -jar app.jar
Application de développement ou outil CLI
Laissez -Xms petit (ou aux valeurs par défaut) pour démarrer vite, et augmentez -Xmx si vous traitez de gros volumes.
Conteneurs Docker / Kubernetes
Depuis Java 10, la JVM respecte automatiquement les limites cgroup. Vous pouvez utiliser des pourcentages de la RAM allouée au conteneur :
java -XX:InitialRAMPercentage=50 -XX:MaxRAMPercentage=75 -jar app.jar
Erreurs courantes
- Définir
-Xmxsupérieur à la RAM disponible : la JVM démarre mais le système swappe, dégradant massivement les performances. - Oublier que le tas n'est pas toute la mémoire : stack, metaspace, buffers natifs et compilation JIT consomment aussi de la RAM hors
-Xmx. Comptez 15 à 30 % de plus. - Confondre
-Xmxavec-XX:MaxMetaspaceSize: ce dernier limite l'espace des classes chargées, pas le tas applicatif.
Paramètres complémentaires utiles
| Option | Rôle |
|---|---|
-Xss | Taille de la pile par thread (par défaut ~1 Mo) |
-XX:MaxMetaspaceSize | Limite le metaspace (classes chargées) |
-XX:+HeapDumpOnOutOfMemoryError | Dump automatique en cas d'OOM |
-XX:+UseG1GC | Force l'utilisation du garbage collector G1 |
Une configuration robuste pour une application Spring Boot en production pourrait être :
java -Xms2g -Xmx2g \
-XX:+UseG1GC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/ \
-jar app.jar
Mesurez toujours l'impact de vos changements avec des outils comme JConsole, VisualVM ou Java Flight Recorder avant de déployer en production.