[JAVA] Apprêt Alibaba Dragonwell 8

Dans ce blog, nous explorerons le Dragonwell 8 récemment annoncé, comment l'installer et l'utiliser, et comment rejoindre la communauté de développement.

Qu'est-ce que Alibaba Dragonwell 8?

Alibaba Dragonwell 8 est une distribution gratuite d'OpenJDK, qui fournit un support à long terme d'Alibaba Cloud, y compris des améliorations de performances et des correctifs de sécurité. Alibaba Dragonwell 8 prend actuellement en charge la plate-forme X86-64 / Linux. Avec l'ajout de Dragonwell 8, vous pouvez considérablement améliorer la stabilité, l'efficacité et les performances du déploiement de grandes applications Java dans votre centre de données. Alibaba Dragonwell 8 est un "fork convivial" sous les mêmes termes de licence que le Projet OpenJDK et est un [Java SE Standard] Compatible avec (https://www.oracle.com/java/). Les utilisateurs peuvent utiliser Alibaba Dragonwell 8 pour développer et exécuter des applications Java. L'open source Alibaba Dragonwell 8 est une version open source d'AJDK, une version personnalisée de l'OpenJDK utilisée en interne par le groupe Alibaba. AJDK est optimisé pour le commerce électronique, la finance et la logistique en fonction de scénarios commerciaux et opère dans un très grand centre de données Alibaba avec plus de 100 000 serveurs.

Comment installer Alibaba Dragonwell 8

Actuellement, Alibaba Dragonwell 8 ne prend en charge que la plate-forme Linux x86-64 et propose un package JDK binaire précompilé. Pour installer Alibaba Dragonwell 8, il y a deux étapes:

  1. Téléchargez le package JDK binaire compilé depuis la page de téléchargement sous Alibaba Dragonwell 8 sur GitHub.
  2. Décompressez le package tar téléchargé dans le répertoire d'installation.

Une fois l'installation terminée, pointez simplement le JAVA_HOME référencé par l'application vers le répertoire d'installation d'Alibaba Dragonwell 8. Considérant Tomcat 8.5.39, par exemple, pour exécuter Tomcat sur Alibaba Dragonwell 8, exécutez simplement la commande suivante lorsque vous démarrez Tomcat.

JAVA_HOME=/path/to/dragonwell8/installation  sh tomcat/bin/catalina.sh start

Pour vérifier que Tomcat fonctionne réellement sur Alibaba Dragonwell 8, vous pouvez ajouter le paramètre -showversion à cette commande Java pour afficher les informations de version de JDK.

JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-showversion" sh tomcat/bin/catalina.sh start

Lorsque vous démarrez Tomcat, vous verrez les informations de version d'Alibaba Dragonwell 8 au début du fichier tomcat / logs / catalina.out.

image.png

Comment utiliser Alibaba Dragonwell 8

Cette section décrit comment tirer parti des différentes fonctionnalités d'Alibaba Cloud Dragonwell 8. Actuellement, la vue d'aperçu de Dragonwell 8 offre deux fonctionnalités qui sont en interne en mode de fonctionnement complet dans le groupe Alibaba. Enregistreur de vol JWarmUp et Java. Pour les deux fonctionnalités, des JEP ou des correctifs ont été soumis à la communauté OpenJDK. Nous espérons que les utilisateurs d'Alibaba Dragonwell 8 pourront profiter de ces deux fonctionnalités à l'avance avant que la fusion en amont ne soit terminée.

Préchauffez rapidement votre application Java avec JWarmUp

OpenJDK utilise la technologie de compilation JIT (Just in Time), qui compile le code d'octet Java en code machine dynamiquement optimisé pour améliorer l'efficacité de l'exécution. Cependant, avant que cette compilation ne soit terminée, le code Java s'exécute en mode interpréteur, ce qui est relativement inefficace.

Lorsqu'une application est lancée et que le trafic métier arrive, de nombreuses méthodes Java sont susceptibles de commencer à se compiler à l'aide de JIT et la demande métier est exécutée par un interpréteur lent. Le résultat final de ce comportement est une charge système très élevée et de nombreux délais d'expiration des demandes des utilisateurs. De nombreuses solutions précédentes à ce problème ont consisté à utiliser le trafic simulé pour réchauffer l'application. La fonction JWarmUp fournit une nouvelle option pour résoudre ce problème: préchauffer l'application en cours pour qu'elle s'exécute avec un enregistrement de la dernière exécution et de la compilation de la machine virtuelle Java.

La figure suivante montre le fonctionnement de JWarmUp.

image.png

Un scénario d'application typique pour JWarmUp consiste à publier une nouvelle version d'application.

  1. JWarmUp exécute d'abord une application Java sur une machine dans un environnement bêta pendant une courte période, puis enregistre et collecte les métadonnées des actions entreprises par le compilateur JIT pendant cette période.
  2. Ensuite, JWarmUp copie les métadonnées récupérées sur chaque machine / conteneur de production contenant la nouvelle version du code.
  3. Enfin, les métadonnées générées dans l'environnement bêta utilisent le paramètre JWarmUp pour guider la machine de production pour terminer le préchauffage JIT dans le processus de lancement de l'application. Sera chargé dans.

De cette façon, votre application fonctionnera mieux à la demande de l'utilisateur.

Collecte des données d'échauffement

Encore une fois, en prenant Tomcat comme exemple, les paramètres de ligne de commande suivants peuvent être ajoutés pour collecter les métadonnées générées dans l'environnement bêta lors de la compilation JIT, et le paramètre -XX: CompilationWarmUpLogfile = est généré. Spécifiez le chemin du fichier JWarmUp.

JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:ReservedCodeCacheSize=512m -XX:CompilationWarmUpLogfile=$PWD/jwarmup.log -XX:+CompilationWarmUpRecording -XX:+CompilationWarmUp -XX:-TieredCompilation -XX:+DeoptimizeBeforeWarmUp -XX:CompilationWarmUpDeoptTime=30 -XX:+PrintCompilationWarmUpDetail" sh bin/catalina.sh start

Ensuite, ce fichier généré peut être envoyé à la machine en production en utilisant OSS, SFTP ou d'autres méthodes.

Préchauffer les applications Java avec des données enregistrées

Sur une machine de production, vous pouvez lancer une nouvelle instance de Tomcat en utilisant les données de préchauffage précédentes en utilisant simplement les paramètres suivants: Le paramètre xx: CompilationWarmUpLogfile = spécifie le chemin vers le fichier JWarmUp à charger. Ce fichier doit avoir été copié à partir de l'environnement bêta à l'étape précédente afin de collecter les données de préchauffage.

JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:ReservedCodeCacheSize=512m -XX:CompilationWarmUpLogfile=$PWD/jwarmup.log -XX:+CompilationWarmUp -XX:-TieredCompilation -XX:+DeoptimizeBeforeWarmUp   -XX:CompilationWarmUpDeoptTime=30 -XX:+PrintCompilationWarmUpDetail" sh bin/catalina.sh start

Utilisez Java Flight Recorder pour analyser les performances des applications Java

JFR (Java Flight Recorder) est une fonction d'analyse des performances basée sur les événements intégrée à la JVM. Cette fonctionnalité commerciale est disponible à partir d'Oracle JDK 7u4. Cette fonctionnalité a été open source dans JDK 11 en 2018. Cependant, il n'est pas pris en charge dans JDK8.

Alibaba travaille avec des entreprises telles que Red Hat, Azul et Amazon pour ajouter la prise en charge de cette fonctionnalité à JDK 8. Cependant, ce patch n'est pas actuellement fusionné dans OpenJDK8u. Pour obtenir un support pour cette fonctionnalité à l'avance, Alibaba Dragonwell 8 propose une version JFR portée par Alibaba.

L'utilisation de JFR est très simple. Utilisez simplement les paramètres de ligne de commande et les commandes jcmd pour contrôler HotSpot et générer des données de performances dans un fichier. Vous pouvez ensuite utiliser les outils JMC open source pour ouvrir et analyser les fichiers générés dans une interface graphique.

Collectez les données de performance à l'aide de JFR

Par défaut, la fonction JFR est désactivée dans Alibaba Dragonwell 8. Pour activer la fonction JFR, vous devez ajouter le paramètre de ligne de commande -XX: + EnableJFR. Alibaba Dragonwell 8 propose plusieurs options pour collecter des données de performance à l'aide de JFR.

Vous pouvez utiliser des paramètres de ligne de commande dans votre application pour spécifier que JFR doit commencer à collecter les données de performances immédiatement après le lancement de l'application. Ceci est utile pour diagnostiquer les problèmes de démarrage. Le code de l'exemple suivant collecte les données JFR pendant une minute lorsque le module JFR du processus Java est initialisé et renvoie ces données dans un fichier nommé rec.jfr.

JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:+EnableJFR -XX:StartFlightRecording=duration=1m,filename=rec.jfr" sh bin/catalina.sh start

Vous pouvez également ajouter simplement -XX: + EnableJFR à votre application et utiliser la commande jcmd pour collecter des données à tout moment après le démarrage de l'application.

Par exemple, vous pouvez démarrer Tomcat avec la commande suivante.

JAVA_HOME=/path/to/dragonwell8/installation JAVA_OPTS="-XX:+EnableJFR" sh bin/catalina.sh start

Pour collecter des données à analyser, exécutez simplement la commande jcmd correspondante dans JFR en utilisant le PID du processus Tomcat que vous analysez. Par exemple, Tomcat utilise la commande suivante pour collecter des données pendant 10 secondes à partir d'un moment précis.

$ ps ax | grep tomcat
 77522 pts/18   Sl+    0:08 /home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/../j2sdk-image/bin/java -Djava.util.logging.config.file=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -XX:+EnableJFR -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/bin/bootstrap.jar:/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/bin/tomcat-juli.jar -Dcatalina.base=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39 -Dcatalina.home=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39 -Djava.io.tmpdir=/home/chuansheng.lcs/dw_test/apache-tomcat-8.5.39/temp org.apache.catalina.startup.Bootstrap start
 98451 pts/22   S+     0:00 grep --color=auto tomcat

$ dragonwell8_home/bin/jcmd 77522 JFR.start duration=10s filename=$PWD/rec3.jfr
77522:
Started recording 3. The result will be written to:

/home/my/workdir/rec3.jfr

Après 10 secondes, le fichier /home/my/workdir/rec3.jfr JFR sera généré. Vous pouvez analyser le fichier avec JMC.

Vous pouvez également lancer JFR directement pour collecter des données sans spécifier de période de collecte de données et vider manuellement toutes les données générées dans un fichier si nécessaire.

$ dragonwell8_home/bin/jcmd 2823 JFR.start filename=$PWD/rec4.jfr
2823:
Started recording 4. No limit specified, using maxsize=250MB as default.

Use JFR.dump name=4 to copy recording data to file.

$ dragonwell8_home/bin/jcmd 2823 JFR.dump name=4 filename=rec4.jfr
2823:
Dumped recording "Recording-4", 332.7 kB written to:

/path/to/my/workdir/rec4.jfr

Utilisez JMC pour l'analyse des performances

JFR enregistre les données de performances des applications Java dans des fichiers binaires. JMC (Java Mission Control) vous permet d'analyser un ensemble particulier de données de performance avec une interface graphique. JMC est un outil open source. Non inclus dans Alibaba Dragonwell 8. Pour utiliser cet outil, téléchargez-le sur le site officiel d'OpenJDK https://jdk.java.net/jmc/ S'il vous plaît.

Notez que JMC 7.0 ou version ultérieure est nécessaire pour analyser les fichiers de données JFR générés à l'aide d'Alibaba Dragonwell 8.

Après avoir ouvert le JMC, vous pouvez cliquer sur un élément spécifique à gauche pour analyser en détail les événements survenus lors de l'échantillonnage.

image.png

Prise en charge du diagnostic et du débogage

Alibaba Dragonwell 8 intègre également certaines fonctionnalités de diagnostic utiles décrites ci-dessous.

Fonction d'alerte pour l'allocation d'objets volumineux

Le nouveau paramètre JVM -XX: ArrayAllocationWarningSize = peut être utilisé à cette fin. Par exemple, le code ci-dessous attribue un tableau relativement grand.

public static void main(String[] args) {
    doAlloc(32 * 1024 * 1024 + 1);
}
private static Object doAlloc(int size) {
    return new byte[size];
}

L'ajout de l'option ʻArrayAllocationWarningSize` pendant l'exécution du code affichera la pile Java en cours d'exécution pendant que ce tableau est alloué.

image.png

Prise en charge détaillée des journaux ParNew GC

Par défaut, Alibaba Dragonwell 8 utilise l'algorithme CMS (Concurrent Mark Sweep), et la jeune génération utilise l'algorithme ParNew. Par conséquent, le journal ParNew GC comporte deux améliorations intégrées.

jinfo -flag +PrintYoungGenHistoAfterParNewGC <pid>

Une fois cette opération d'impression terminée, cette option est redéfinie sur false pour éviter une sortie excessive. Voici un exemple de sortie typique.

image.png

image.png

Prise en charge de la rationalisation des vidages de tas

L'outil jmap d'Alibaba Dragonwell 8 prend en charge une nouvelle option de vidage, mini, qui vous permet d'ignorer le contenu de tous les tableaux du type d'origine lors de la génération de HeapDump. Cette option réduit considérablement la taille du fichier HeapDump généré, ce qui est particulièrement utile dans les scénarios où vous devez uniquement vérifier la relation entre les types et les objets.

La figure suivante montre un exemple de code.

image.png

Participez à la construction de la communauté Alibaba Dragonwell

La communauté Alibaba Dragonwell fournit un support à long terme pour la version JDK. Vous pouvez obtenir de l'aide, participer à des discussions et partager des idées sur les canaux suivants:

Page des problèmes du projet Alibaba Dragonwell sur GitHub

Les références

[1] Document officiel d'Oracle Java 8: https://docs.oracle.com/javase/8/ [2] Page d'accueil du projet OpenJDK 8: https://openjdk.java.net/projects/jdk8u/ [3] Projet Alibaba Dragonwell 8: https://github.com/alibaba/dragonwell8 [4] Alibaba Dragonwell 8 Developer Guide: https://github.com/alibaba/dragonwell8/wiki/Developer-Guide

Recommended Posts

Apprêt Alibaba Dragonwell 8