# Programmation Java/Paramétrer la JVM

* Introduction
* La notion de machine virtuelle
* Installation
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Premier programme
** Commentaires
** Types de base
** Opérateurs
** Conditions
** Bloc de portée
** Itérations
** Tableaux
* Les classes en Java
** Membres
** Modificateurs d'accès
** Héritage
** Encapsulation
** Polymorphisme
** Classes abstraites
** Interfaces
** Classes internes
** Transtypage
** Types génériques
** Instanciation et cycle de vie
** « this »
** Objets comparables et clés
** Énumérations
** Exceptions
** Packages
* Classes de base
** Collections
** Nombre de taille arbitraire
** Tags Javadoc
** Annotations
** Entrées sorties
** Threads et synchronisation
** Méthodes natives
** Réflexion
** Regex
** JUnit
* Conclusion
* Exemples en Java
** Générer un carré magique
** Générer un triangle de Sierpiński
** XML
** Swing
*** Un premier exemple
*** Formulaire avec boutons sur image
*** Calcul de somme
*** Calcul de distance
* Annexes
** Les outils de base fournis avec le Java Development Kit
** Créer une archive Java
** Paramétrer la JVM
** Liste des mots réservés
** Débogage
** Java et les autres langages
* Introduction
* La notion de machine virtuelle
* Installation
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Premier programme
** Commentaires
** Types de base
** Opérateurs
** Conditions
** Bloc de portée
** Itérations
** Tableaux
* Les classes en Java
** Membres
** Modificateurs d'accès
** Héritage
** Encapsulation
** Polymorphisme
** Classes abstraites
** Interfaces
** Classes internes
** Transtypage
** Types génériques
** Instanciation et cycle de vie
** « this »
** Objets comparables et clés
** Énumérations
** Exceptions
** Packages
* Classes de base
** Collections
** Nombre de taille arbitraire
** Tags Javadoc
** Annotations
** Entrées sorties
** Threads et synchronisation
** Méthodes natives
** Réflexion
** Regex
** JUnit
* Conclusion
* Exemples en Java
** Générer un carré magique
** Générer un triangle de Sierpiński
** XML
** Swing
*** Un premier exemple
*** Formulaire avec boutons sur image
*** Calcul de somme
*** Calcul de distance
* Annexes
** Les outils de base fournis avec le Java Development Kit
** Créer une archive Java
** Paramétrer la JVM
** Liste des mots réservés
** Débogage
** Java et les autres langages
[ Modifier le sommaire ]
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 :
* au moment du lancement du programme Java (et de la JVM) ;
* 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)

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
#### Image de démarrage (Splash screen)

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.
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 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

| Nom du paramètre | 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

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 :

## Modification d'un paramètre de la JVM

Au lancement d'un programme Java, il est possible de positionner un ou plusieurs paramètres système de la manière suivante :
Exemple pour positionner le proxy à utiliser :
    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 :
    dans cet exemple, le proxy utilisé sera l'hôte "monproxy" sur le port 3128 en utilisant comme utilisateur "toto"

## Références

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