Un guide des paramètres JVM pour les développeurs Java
Lorsque vous écrivez du code source, vous écrivez du code que les humains peuvent lire. Les ordinateurs ne peuvent pas exécuter le code source tant que le code n’est pas compilé dans Language de machine, un terme générique faisant référence à un nombre quelconque de langues requises par une machine spécifique. Normalement, si vous compilez du code sous Linux, il s’exécute sous Linux, et si vous compilez du code sous Windows, il s’exécute sous Windows, et ainsi de suite. Cependant, Java est différent. Il ne cible pas une machine réelle. Il cible quelque chose appelé la machine virtuelle Java (JVM) et peut donc s’exécuter sur n’importe quelle machine.
Le code source Java est compilé en bytecode qui est exécuté par une JVM installée sur un ordinateur. La JVM est un moteur d’exécution, mais ce n’est pas celui avec lequel vous interagissez directement. Il fonctionne silencieusement, traitant le bytecode Java. La plupart des gens n’ont pas besoin de penser ou même de connaître la JVM, mais il peut être utile de comprendre comment la JVM fonctionne afin de pouvoir déboguer et optimiser le code Java. Par example:
-
Dans l’environnement de production, vous constaterez peut-être qu’une application déployée a besoin d’une amélioration des performances.
-
Si quelque chose ne va pas dans une application que vous avez écrite, le développeur et l’utilisateur final ont des options pour déboguer le problème.
-
Si vous souhaitez connaître les détails du kit de développement Java (JDK) utilisé pour développer ou exécuter une application Java, vous pouvez obtenir ces détails en interrogeant la JVM.
Cet article présente quelques paramètres JVM de base pour vous aider dans ces scénarios…
(Jayashree Huttanagoudar CC BY-SA 4.0)
Contents
Quelle est la différence entre une JVM, un JDK et un JRE ?
Java a beaucoup d’acronymes J, y compris JVM, JDK et JRE.
-
Un kit de développement Java (JDK) est accessible aux programmeurs qui ont besoin de bibliothèques de développement à utiliser dans leur code.
-
L’environnement d’exécution Java (JRE) est utilisé par les personnes qui souhaitent exécuter une application Java.
-
La machine virtuelle Java (JVM) est le composant qui exécute le bytecode Java.
Le JDK contient à la fois un JRE et une JVM, mais certaines distributions Java proposent un autre téléchargement contenant un JRE (y compris une JVM).
(Jayashree Huttanagoudar CC BY-SA 4.0)
Java est open source, donc différentes entreprises créent et distribuent des JDK. Vous pouvez en installer plusieurs sur votre système, ce qui peut être utile lorsque vous travaillez ou utilisez différents projets Java, dont certains peuvent utiliser un ancien JDK.
Pour répertorier les JDK sur votre système Linux, vous pouvez utiliser la commande alternatives :
$ alternatives --config java
There are 2 programs that provide java.
Selection Command
-----------------------------------------------
*+ 1 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-2.fc35.x86_64/bin/java)
2 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.fc35.x86_64/jre/bin/java)Enter to keep the current selection[+], or type selection number:
Pour basculer entre les JDK disponibles, exécutez à nouveau la commande :
$ sudo alternatives --config java
Une autre option consiste à utiliser SDKMan, qui vous aide à télécharger, mettre à jour et gérer les JDK sur votre système.
Qu’est-ce que le réglage JVM ?
Le réglage d’une JVM est le processus d’ajustement des paramètres de la JVM pour améliorer les performances de l’application Java. Il aide également à diagnostiquer l’échec de l’application.
En général, il est important de considérer ces points avant le réglage :
-
Coût : Parfois, l’amélioration du matériel exécutant votre code peut améliorer les performances d’une application. Cela peut sembler être une “triche”, mais considérez combien de temps vous êtes prêt à passer à régler les paramètres JVM. Parfois, une application nécessite plus de mémoire pour fonctionner comme vous le souhaitez, et aucun piratage logiciel ne changera cela.
-
Résultat souhaité: La stabilité est plus importante que la performance à long terme. Si votre réglage affecte la stabilité, il est probablement préférable de choisir judicieusement vos paramètres de réglage.
-
Problèmes sous-jacents : Parfois, le problème peut être un problème sous-jacent avec le système d’exploitation hôte. Avant de régler la JVM, assurez-vous que la plate-forme de la JVM fonctionne comme prévu.
-
Fuites de mémoire: Si vous vous retrouvez à utiliser les paramètres de réglage Garbage Collection (GC), il y a probablement des fuites de mémoire qui doivent être corrigées dans le code de l’application.
Types de paramètres JVM
Les paramètres JVM sont regroupés en trois catégories : options standard, non standard et avancées.
Options standards
Toutes les implémentations JVM prennent en charge les options standard. Exécutez la commande ‘java’ dans un terminal pour voir une liste d’options standard.
$ java
Usage: java [options] <mainclass> [args...]
(to execute a class)
or java [options] -jar <jarfile> [args...]
(to execute a jar file)where options include:
-cp <class search path of directories and zip/jar files>
-classpath <class search path of directories and zip/jar files>
--class-path <class search path of directories and zip/jar files>
A : separated list of directories, JAR archives,
and ZIP archives to search for class files.
--enable-preview
allow classes to depend on preview features of this releaseTo specify an argument for a long option, you can use --<name>=<value> or
--<name> <value>.
Ce sont toutes des options standard incluses avec n’importe quelle JVM, et vous pouvez les utiliser en toute sécurité comme vous utilisez n’importe quelle option de ligne de commande. Par exemple, pour valider les options de commande pour la configuration, créer une machine virtuelle et charger une classe principale sans exécuter la classe principale, utilisez :
$ java --dry-run <classfile>
Options non standard
Les options non standard commencent par -X
. Ceux-ci sont destinés à un usage général et sont spécifiques à une implémentation particulière de JVM. Pour lister ces options :
$ java -X
-Xbatch disable background compilation
-Xbootclasspath/a:<directories and zip/jar files separated by :>
append to end of bootstrap class path
-Xinternalversion
displays more detailed JVM version information than the
-version option
-Xloggc:<file> log GC status to a file with time stamps
[...]
Ces options supplémentaires sont susceptibles d’être modifiées sans préavis et ne sont pas prises en charge par toutes les implémentations JVM.
Une JVM construite par Microsoft peut avoir des options différentes de celle construite par Red Hat, etc.
Pour obtenir des informations détaillées sur la version JVM, utilisez l’option suivante :
$ java -Xinternalversion --version
OpenJDK 64-Bit Server VM (11.0.13+8) for linux-amd64 JRE (11.0.13+8), built on Nov 8 2021 00:00:00 by "mockbuild" with gcc 11.2.1 20210728 (Red Hat 11.2.1-1)
Pour obtenir le paramètre de propriété, utilisez :
$ java -XshowSettings:properties --version
Options avancées
Ces options ne sont pas destinées à une utilisation occasionnelle et sont utilisées pour régler les zones spécifiques de la machine virtuelle Hotspot. Ces options sont susceptibles d’être modifiées et rien ne garantit que toutes les implémentations JVM les prendront en charge.
Ces options commencent par -XX. Pour répertorier ces options, utilisez la commande suivante :
$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
Par exemple, pour suivre le chargement de la classe, utilisez la commande ci-dessous :
$ java -XX:+TraceClassLoading Hello
Le Hello.java a :
Un autre problème courant auquel vous pourriez être confronté est les erreurs OOM (Out Of Memory), qui peuvent se produire sans beaucoup d’informations de débogage. Pour résoudre un tel problème, vous pouvez utiliser l’option de débogage -XX:+HeapDumpOnOutOfMemoryError, qui crée un fichier .hprof avec des informations de débogage.
$ cat TestClass. java
import java.util.ArrayList;
import java.util.List;
public class TestClass {
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();
for (int i = 0; i < 1000; i++) {
list.add(new char[1000000]);
}
}
}
$ Javac TestClass.java
$ java -XX:+HeapDumpOnOutOfMemoryError -Xms10m -Xmx1g TestClass
java.lang.OutOfMemoryError: java heap space
Dumping heap to java_pid444496.hprof ...
Heap dump file created [1018925828 bytes in 1.442 secs]
Exception in thread "main" java.lang.OutOfMemoryError: java heap space
at TestClass.main(TestClass.Java:8)
Il existe des outils pour examiner ce fichier .hprof afin de comprendre ce qui n’a pas fonctionné.
Conclusion
En comprenant et en utilisant JVM et les paramètres JVM, les développeurs et les utilisateurs finaux peuvent diagnostiquer les pannes et améliorer les performances d’une application Java. La prochaine fois que vous travaillerez avec Java, prenez un moment pour examiner les options qui s’offrent à vous.