Optimisation des performances des applications Java

JavaJavaBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Les paramètres JVM sont utilisés pour configurer la Machine Virtuelle Java (JVM), qui est responsable de l'exécution du bytecode Java. En configurant correctement les paramètres JVM, nous pouvons améliorer les performances des applications Java. Dans ce laboratoire, nous allons apprendre à définir certains paramètres JVM couramment utilisés pour optimiser les performances des applications Java.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java/BasicSyntaxGroup -.-> java/output("Output") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/FileandIOManagementGroup -.-> java/io("IO") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("Working") java/SystemandDataProcessingGroup -.-> java/system_methods("System Methods") subgraph Lab Skills java/output -.-> lab-117968{{"Optimisation des performances des applications Java"}} java/classes_objects -.-> lab-117968{{"Optimisation des performances des applications Java"}} java/exceptions -.-> lab-117968{{"Optimisation des performances des applications Java"}} java/io -.-> lab-117968{{"Optimisation des performances des applications Java"}} java/working -.-> lab-117968{{"Optimisation des performances des applications Java"}} java/system_methods -.-> lab-117968{{"Optimisation des performances des applications Java"}} end

Paramétrer la mémoire tampon

La mémoire tampon est la zone de données exécutées dans laquelle les objets Java sont alloués. Nous pouvons définir la taille de la mémoire tampon avec les paramètres -Xmx et -Xms.

  • -Xmx<taille de la mémoire tampon>[unité]: définit la taille maximale de la mémoire tampon.
  • -Xms<taille de la mémoire tampon>[unité]: définit la taille initiale de la mémoire tampon.

Par exemple, pour définir la taille minimale de la mémoire tampon à 512 Mo et la taille maximale de la mémoire tampon à 1 Go, nous pouvons utiliser la commande suivante :

java -Xms512m -Xmx1g MyApp

Choix des collecteurs de ramasse-miettes

La collecte de ramasse-miettes est le processus de libération de la mémoire occupée par les objets qui ne sont plus utilisés par l'application Java. Le choix du collecteur de ramasse-miettes peut avoir un impact significatif sur les performances de l'application. La JVM propose plusieurs collecteurs de ramasse-miettes, chacun avec ses propres avantages et inconvénients.

  • -XX:+UseSerialGC: active le collecteur de ramasse-miettes sériel, qui utilise un seul thread pour la collecte de ramasse-miettes.
  • -XX:+UseParallelGC: active le collecteur de ramasse-miettes parallèle, qui utilise plusieurs threads pour la collecte de ramasse-miettes.
  • -XX:+UseParNewGC: active le collecteur de ramasse-miettes concurrent-mark-sweep (CMS), qui utilise plusieurs threads pour effectuer une collecte de ramasse-miettes concurrente.
  • -XX:+UseG1GC: active le collecteur de ramasse-miettes Garbage-first (G1), qui est conçu pour offrir des temps d'arrêt cohérents et un débit élevé.

Par exemple, pour activer le collecteur de ramasse-miettes parallèle, nous pouvons utiliser la commande suivante :

java -XX:+UseParallelGC MyApp

Journalisation des activités de collecte de ramasse-miettes

La journalisation de la collecte de ramasse-miettes nous permet de surveiller les performances du collecteur de ramasse-miettes et d'ajuster les paramètres du collecteur de ramasse-miettes en fonction des exigences de l'application. Nous pouvons utiliser les paramètres suivants pour activer la journalisation de la collecte de ramasse-miettes :

  • -XX:+UseGCLogFileRotation : active la rotation des journaux pour les journaux de collecte de ramasse-miettes.
  • -XX:NumberOfGCLogFiles=<nombre de fichiers de journal> : limite le nombre de fichiers de journal pour les journaux de collecte de ramasse-miettes.
  • -XX:GCLogFileSize=<taille du fichier><unité> : spécifie la limite de taille pour les journaux de collecte de ramasse-miettes.
  • -Xloggc:[chemin vers le fichier gc.log] : spécifie le chemin pour les journaux de collecte de ramasse-miettes.

Par exemple, pour activer la journalisation de la collecte de ramasse-miettes et définir le chemin du fichier de journal sur /path/to/gc.log, nous pouvons utiliser la commande suivante :

java -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/path/to/gc.log MyApp

Gestion des erreurs de manque de mémoire

Lorsque la JVM se retrouve sans mémoire, elle lance une erreur Out Of Memory Error. Nous pouvons utiliser les paramètres JVM suivants pour gérer cette erreur :

  • -XX:+HeapDumpOnOutOfMemoryError : lorsque l'erreur Out Of Memory Error se produit, la JVM écrira un fichier de capture de mémoire sur le disque.
  • -XX:HeapDumpPath=<chemin vers le fichier de capture de mémoire> : spécifie le chemin pour le fichier de capture de mémoire.
  • -XX:OnOutOfMemoryError=<commande> : lorsque l'erreur Out Of Memory Error se produit, la JVM exécutera la commande spécifiée.
  • -XX:+UseGCOverheadLimit : la JVM utilise cette option pour définir une limite sur la durée passée dans la collecte de ramasse-miettes.

Par exemple, pour configurer la JVM pour écrire un fichier de capture de mémoire dans le fichier /path/to/heapdump.hprof lorsque l'erreur Out Of Memory Error se produit, nous pouvons utiliser la commande suivante :

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof MyApp

Utilisation de la JVM 64 bits

Nous pouvons utiliser le paramètre -d pour sélectionner la JVM 32 bits ou 64 bits. Par exemple, pour utiliser la JVM 64 bits, nous pouvons utiliser la commande suivante :

java -d64 MyApp

Compiler et exécuter une application Java avec des paramètres JVM

Utilisons le programme HelloWorld.java pour compiler et exécuter l'application Java avec les paramètres JVM que nous avons appris dans les étapes précédentes.

cd ~/projet
touch HelloWorld.java
touch HelloWorld.java

Entrez le code suivant :

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Bonjour, le monde!");
    }
}

Enregistrez le fichier et quittez. Maintenant, compilons et exécutons le code avec le paramètre -Xmx :

javac HelloWorld.java
java -Xmx512m HelloWorld

Cela définit la taille maximale de la mémoire heap à 512 Mo. Nous devrions voir la sortie :

Bonjour, le monde!

Compiler et exécuter une application Java avec des collecteurs de ramasse-miettes

Maintenant, compilons et exécutons l'application Java avec le collecteur de ramasse-miettes parallèle :

java -XX:+UseParallelGC HelloWorld

Nous devrions voir la sortie :

Bonjour, le monde!

Compiler et exécuter une application Java avec la journalisation de la collecte de ramasse-miettes

Maintenant, compilons et exécutons l'application Java avec la journalisation de la collecte de ramasse-miettes activée :

java -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/path/to/gc.log HelloWorld

Cela définit le chemin du fichier de journal sur /path/to/gc.log.

Compiler et exécuter une application Java avec d'autres paramètres couramment utilisés

Maintenant, compilons et exécutons l'application Java avec les paramètres -XX:+UseStringDeduplication et -XX:MaxHeapFreeRatio :

java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld

Cela active la suppression des doublons de chaînes de caractères et définit le ratio maximal d'espace mémoire libre dans la mémoire heap après la collecte de ramasse-miettes à 70 %.

Sommaire

Dans ce laboratoire, nous avons appris à définir divers paramètres JVM pour optimiser les performances des applications Java. Nous avons appris à définir la taille de la mémoire heap, à choisir des collecteurs de ramasse-miettes, à activer la journalisation de la collecte de ramasse-miettes, à gérer les erreurs de manque de mémoire, à utiliser un JVM 64 bits et à définir certains autres paramètres couramment utilisés. Nous avons également appris à compiler et à exécuter une application Java avec des paramètres JVM.