Programmation Java/Paramétrer la JVM

La machine virtuelle Java désigne l'environnement d'exécution d'un programme Java. Il est possible d'adapter cet environnement suivant les besoins : utilisation de la mémoire, configuration du réseau, etc.

Il existe deux possibilités de paramétrage de cet environnement :

  1. au moment du lancement du programme Java (et de la JVM) ;
  2. au cours de l'exécution d'un programme Java.

L'action de paramétrer la machine virtuelle représente le changement d'état d'un paramètre système. Dans un premier temps, les paramètres les plus utilisés sont listés. Ensuite, les deux possibilités de paramétrage sont exposées.

Liste des paramètres de la machine virtuelle Java (JVM) modifier

Beaucoup de paramètres et options sont liés au fonctionnement interne de la JVM : réseau, mémoire (ramasse-miette), ... En cas de doute, utilisez les valeurs par défaut.

Paramètres de lancement d'application modifier

Image de démarrage (Splash screen) modifier

Durant le lancement d'une application Java, il est possible de spécifier à la JVM d'afficher une image d'attente (comme lors du lancement d'Eclipse par exemple) en utilisant l'option -splash.

-splash:<chemin_de_l_image>

L'image doit se situer dans le système de fichiers (elle ne peut pas être dans un JAR), et utiliser l'un des formats supportés : PNG, GIF, JPEG, BMP. Pour une application dans une archive JAR, il est possible d'afficher une image de splash screen en utilisant le paramètre SplashScreen-Image dans le fichier manifest.

L'application peut récupérer la fenêtre affichant l'image (pour y ajouter une barre de progression ou une animation par exemple) en utilisant la méthode getSplashScreen() de la classe java.awt.SplashScreen[1] retournant l'instance de cette classe créée par la JVM.

La fenêtre de splash screen est automatiquement fermée quand l'application affiche sa première fenêtre d'interface graphique.

Paramètres du proxy modifier

Nom du paramètre[2] Description
http.proxyHost Nom du serveur proxy
http.proxyPort Port du proxy (valeur par défaut:80)
http.nonProxyHosts Liste des hôtes qui doivent être accédés directement, sans passer par le proxy. Il s'agît d'une liste d'expressions régulières séparées par '|'. Tous les hôtes correspondant à l'une de ces expressions seront accédés par une connexion directe sans passer par le proxy
http.proxyUser Nom d'utilisateur utilisé pour le proxy
http.proxyPassword Mot de passe utilisateur utilisé pour le proxy

Paramètres de la mémoire modifier

La mémoire utilisée pour l'allocation dynamique des objets est appelée le tas (heap en anglais), paramétrable avec les options commençant par -Xm. Le paramétrage de la mémoire se fait au lancement d'un programme Java grâce aux options du tableau ci-dessous.

Nom du paramètre Description
-Xms Taille initiale du tas (Memory Start)
-Xmx Taille maximale du tas (Memory maX)
-Xmn Taille du tas (Memory Nursery) pour les objets ayant un cycle de vie court.

Le tas de jeune génération (Young generation) est celui où les objets sont créés. Le ramasse-miette (garbage collector) passe plus souvent dans ce tas pour libérer les objets qui ne sont plus utilisés. Tout objet s'y trouvant durant 2 ou 3 cycles du ramasse-miette est déplacé vers le tas des objets plus anciens (Old generation).

-Xss Taille de la pile (Stack Size) pour chaque processus léger (thread).

La pile est la zone mémoire où les arguments et variables locales sont empilées durant l'appel à une méthode. Une taille insuffisante peut aboutir à une exception de classe StackOverflowError lors d'un appel à une méthode (ce qui est le cas notamment pour une récursivité infinie car cela exige une pile de taille infinie).

Exemple pour lancer un programme Java en allouant 256 Mo :

java -Xms256M -Xmx256M monProgrammeJava

Modification d'un paramètre de la JVM modifier

Au lancement d'un programme Java, il est possible de positionner un ou plusieurs paramètres système de la manière suivante :

$ java -D<nom du paramètre1>=<valeur du paramètre1> -D<nom du paramètre2>=<valeur du paramètre2> monProgrammeJava

Exemple pour positionner le proxy à utiliser :

$ java -Dhttp.proxyHost=monproxy -Dhttp.proxyPort=3128 monProgrammeJava
dans cet exemple, le proxy utilisé sera l'hôte "monproxy" sur le port 3128

Au sein d'un programme Java, il est possible de changer l'état d'un paramètre système de la manière suivante :

System.getProperties().put("http.proxyHost", "monproxy");
System.getProperties().put("http.proxyPort", "3128");
System.getProperties().put("http.proxyUser", "toto");
System.getProperties().put("http.proxyPassword", "totoisback");
dans cet exemple, le proxy utilisé sera l'hôte "monproxy" sur le port 3128 en utilisant comme utilisateur "toto"

Références modifier

  1. (anglais) https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html
  2. (anglais) https://docs.oracle.com/javase/6/docs/api/java/net/Proxy.html