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 OutOfMemoryError au 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 -Xmx supé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 -Xmx avec -XX:MaxMetaspaceSize : ce dernier limite l'espace des classes chargées, pas le tas applicatif.

Paramètres complémentaires utiles

OptionRôle
-XssTaille de la pile par thread (par défaut ~1 Mo)
-XX:MaxMetaspaceSizeLimite le metaspace (classes chargées)
-XX:+HeapDumpOnOutOfMemoryErrorDump automatique en cas d'OOM
-XX:+UseG1GCForce 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.