web-dev-qa-db-fra.com

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

J'ai lu sur CDS 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 pour charger le 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, donc jvm mappe directement la mémoire en fonction des informations de mappage fournies 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 je me trompais.

Venons-en maintenant à Java 10, comment puis-je y parvenir pour mon code d'application? Deuxièmement, le code d'application complet serait-il éligible pour CDS ou y a-t-il des restrictions?

16
Shubham Kadlag

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 en tant que préfixe
  • si vous avez des problèmes, utilisez -Xlog:class+load ( plus sur -Xlog ) pour obtenir plus d'informations
12
Nicolai

Le JEP pour AppCDS a l'exemple de casse montrant comment ajouter vos classes d'application à l'archive partagée. Quant aux restrictions, il y en a peu:

  1. Les classes droites (.class) présentes dans le répertoire sur le chemin de classe ne peuvent pas être ajoutées à l'archive partagée. Voir ceci thread .
  2. Les classes chargées par des chargeurs de classe personnalisés ne peuvent pas être ajoutées à l'archive partagée. Voir ceci thread .

Il y a d'autres considérations pratiques à prendre en compte lors de l'utilisation de CDS/AppCDS, telles 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 Java ou agent (s) JVMTI qui modifie/re-transforme/redéfinit le fichier de classe au moment de l'exécution, alors l'archive partagée ne sera pas utile car les classes seront chargé à partir du disque car les agents ont besoin de données de fichier de classe réelles qui, je crois, ne sont pas stockées dans l'archive partagée.

Un autre article agréable et détaillé sur CDS et AppCDS est https://simonis.github.io/cl4cds/ .

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

Si vous êtes intéressé à utiliser CDS, vous pouvez également essayer OpenJ9 JVM qui a cette fonctionnalité depuis longtemps et est beaucoup plus mature et complet. En savoir plus ici .

7
Ashutosh