Comment utiliser la fonctionnalité de partage de données de classe d'application de java 10?


J'ai lu sur les CD dans Oracle doc https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html

Ce que j'ai compris, c'est que les fichiers de classe système nécessaires au chargement de la jvm sont analysés, vérifiés puis stockés dans une archive à jre/lib/[arch]/client/classes.jsa. De plus,ils fournissent également leur mappage de mémoire pour jvm, de sorte que jvm mappe directement la mémoire en fonction des informations de mappage données dans l'archive. Cela réduit donc les frais généraux de chargement de classe chaque fois qu'une instance jvm démarre. Veuillez me corriger si c'était mal.

Maintenant arrivé à java 10, comment puis-je y parvenir pour mon code d'application ? Deuxièmement, le code de demande complet serait-il admissible au CEMD ou y a-t-il des restrictions?

Author: Shubham Kadlag, 2018-06-01

2 answers

Il y a trois étapes essentielles pour créer et utiliser une archive avec des données de classe d'application (pour plus de détails, lisez mon article sur le partage de données de classe d'application):

  1. Création d'une liste de classes à inclure dans l'archive:

    java -XX:+UseAppCDS
        -XX:DumpLoadedClassList=classes.lst -jar app.jar
    
  2. Création d'une archive:

    java -XX:+UseAppCDS -Xshare:dump 
        -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=app-cds.jsa --class-path app.jar
    
  3. Utilisation de l'archive:

    java -XX:+UseAppCDS -Xshare:on 
        -XX:SharedArchiveFile=app-cds.jsa -jar app.jar
    

Gardez à l'esprit ce qui suit:

  • vous ne pouvez pas utiliser de caractères génériques ou de fichiers JAR éclatés pour le chemin de classe lors de la création de l'archive
  • le chemin de classe utilisé pour lancer l'application doit avoir celui utilisé pour créer l'archive comme un préfixe
  • si vous avez des problèmes, l'utilisation -Xlog:class+load (plus sur -Xlog) pour obtenir plus d'informations
 7
Author: Nicolai, 2018-06-01 12:50:20

Le JEP pour AppCDS a l'exemple show casing comment ajouter vos classes d'application à l'archive partagée. En ce qui concerne les restrictions, il y en a peu:

  1. Classes droites (.classe) présent dans le répertoire sur le chemin de classe ne peut pas être ajouté à l'archive partagée. Voir ce thread.
  2. Classes chargées par coutume les chargeurs de classe ne peuvent pas être ajoutés à l'archive partagée. Voir ce thread.

Il y a d'autres considérations pratiques à prendre en compte lorsque utilisation de CDS / APPCD, tels que:

  1. Si vous mettez à jour les fichiers jar sur le système de fichiers, vous devrez recréer l'archive partagée.
  2. Si vous utilisez des agents Java ou JVMTI qui modifient/re-transforment/redéfinissent le fichier de classe au moment de l'exécution, l'archive partagée ne sera pas utile car les classes seront chargées à partir du disque car les agents ont besoin de données de fichier de classe réelles qui, je pense, ne sont pas stockées dans l'archive partagée.

Un autre article sympa et détaillé sur les CDS et APPCD est https://simonis.github.io/cl4cds/.

L'auteur de l'article a également écrit unoutil qui permet de partager des classes d'application même si elles sont chargées par un chargeur de classe personnalisé.

Si vous êtes intéressé par l'utilisation de CDS, vous pouvez également essayer OpenJ9 JVM qui a cette fonctionnalité depuis longtemps et est beaucoup plus mature et complète. En savoir plus à ce sujetici .

 3
Author: Ashutosh, 2018-06-03 04:48:19