Après six mois de développement, Oracle a publié Java SE 25 (Java Platform, Standard Edition 24), qui utilise le projet open source OpenJDK comme implémentation de référence. À l'exception de la suppression de certaines fonctionnalités obsolètes, Java SE 25 conserve la compatibilité ascendante avec les versions précédentes de la plateforme Java : la plupart des projets Java écrits antérieurement fonctionneront sans modification avec la nouvelle version. Des versions prêtes à installer de Java SE 25 (JDK, JRE et Server JRE) sont disponibles. Linux (x86_64, AArch64), Windows (x86_64) et macOS (x86_64, AArch64). Développée par le projet OpenJDK, l'implémentation de référence Java SE 25 est entièrement open source sous la licence GPLv2 avec l'exception GNU ClassPath, qui permet la liaison dynamique avec des produits commerciaux.
Java SE 25 est une version à support étendu, avec des mises à jour disponibles jusqu'en 2033 (généralement disponibles jusqu'en septembre 2030). Java SE 17 et 21 continueront également d'être pris en charge en tant que branches à support à long terme (LTS), avec des mises à jour disponibles jusqu'en 2029 et 2031 respectivement (généralement disponibles jusqu'en 2026 et 2028). Le support étendu des branches LTS de Java SE 8 et 11 se poursuivra jusqu'en 2030 et 2032.
Parmi les 25 nouvelles fonctionnalités proposées dans Java SE (1, 2, 3, 4) :
- Une API expérimentale StableValue a été ajoutée pour gérer les objets contenant des données immuables et traités comme des constantes dans la JVM. Des optimisations de performances similaires à celles des champs avec le mot-clé « final » sont appliquées à ces objets. L'API StableValue sépare la création de valeurs constantes de leur initialisation, garantit qu'une valeur ne peut être initialisée qu'une seule fois, réduit le temps de démarrage du programme et permet d'appliquer au code utilisateur les optimisations de repliement de constantes, auparavant réservées au code interne du JDK. UTILISATEURS = StableValue.of(); public static UserService utilisateurs() { return UTILISATEURS.orElseSet(UserService::new); } }
- Ajout d'une API expérimentale pour l'encodage et le décodage d'objets avec des clés cryptographiques, des certificats et des listes de révocation de certificats à l'aide du format PEM (Pivacy-Enhanced Mail).
- La prise en charge des valeurs étendues a été ajoutée, permettant le partage de données immuables entre threads et l'échange efficace de données entre threads enfants (les valeurs sont héritées). Les valeurs étendues sont conçues pour remplacer les variables locales de thread et sont plus efficaces lors de l'utilisation de très grands nombres de threads virtuels (des milliers ou des millions de threads). La principale différence entre les valeurs étendues et les variables locales de thread réside dans le fait qu'elles sont écrites une fois, ne peuvent pas être modifiées et ne restent disponibles que pendant la durée d'exécution du thread.
- Une API a été ajoutée pour utiliser des fonctions de dérivation de clés cryptographiques (KDF), qui permettent de générer des clés supplémentaires de la longueur requise sur la base d'une clé secrète (par exemple, un mot de passe) et d'un ensemble arbitraire de données.
- Le code et les scripts de build pour la prise en charge des systèmes x32 86 bits ont été supprimés. Cette suppression a simplifié l'infrastructure de build et de test du JDK et a permis d'implémenter des fonctionnalités spécifiques à la plateforme sans créer de gestionnaires de secours pour les systèmes x32 86 bits.
- Il est désormais possible d'utiliser une seule instruction « import module M » pour importer tous les packages exportés par un module donné. Cette modification simplifie considérablement la réutilisation des bibliothèques modulaires, permettant d'inclure des bibliothèques et des classes sans spécifier leur position dans la hiérarchie des packages. Par exemple, spécifier « import module java.base » importera les 54 packages contenus dans le module java.base, ce qui nécessitait auparavant des références individuelles (« import java.io.* », « import java.util.* », etc.).
- Une approche de formatage de programme compact est proposée, utile pour l'apprentissage et le développement de petites applications. Ce format compact élimine la nécessité de définir des classes inutiles, importe automatiquement les API standard et fournit des méthodes d'entrée/sortie simplifiées. Par exemple, l'application « Hello, World ! » peut être réduite à : void main() { IO.println("Hello, World !"); }
- Les expressions sont autorisées dans les constructeurs avant l'appel à super(…) utilisé pour invoquer explicitement un constructeur de classe parent à partir d'un constructeur de classe dérivée, à condition que ces expressions ne fassent pas référence à l'instance créée par le constructeur.
- Un mode de ramasse-miettes génératif a été ajouté au ramasse-miettes Shenandoah. Il traite séparément les objets anciens et récemment créés afin d'améliorer l'efficacité de la collecte des objets à courte durée de vie. Ce nouveau mode offre un débit plus prévisible, une meilleure résistance aux fluctuations de charge et une consommation mémoire réduite pendant le ramasse-miettes. L'ordonnanceur Shenandoah vise à réduire les temps d'arrêt pendant le ramasse-miettes en effectuant davantage de tâches en parallèle avec l'exécution des applications Java.
- Le chargement anticipé des classes et la création du cache de liaison ont été simplifiés, accélérant le démarrage de la JVM HotSpot grâce à l'utilisation de classes déjà chargées et liées. Il n'est plus nécessaire de séparer les opérations d'enregistrement de l'activité et de création du cache au démarrage ; une seule commande suffit : java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
- Au démarrage de la machine virtuelle Java HotSpot, la possibilité d'utiliser les profils d'exécution de méthodes obtenus lors du précédent lancement de l'application a été implémentée. Cette modification permet au compilateur JIT d'éviter l'accumulation de statistiques et de générer immédiatement du code natif sans attendre la génération du profil.
- La JVM HotSpot prend en charge les en-têtes d'objet compacts, dont la taille sur les systèmes 64 bits a été réduite de 96 à 64 bits (de 12 à 8 octets). Cette réduction réduit la taille du tas et améliore l'efficacité du cache.
- Une implémentation test de l'API Vector est proposée. Elle fournit des fonctions pour les calculs vectoriels effectués à l'aide des instructions vectorielles des processeurs x86_64 et AArch64, et permet des opérations simultanées sur plusieurs valeurs (SIMD). Contrairement à la vectorisation automatique des opérations scalaires du compilateur JIT HotSpot, la nouvelle API permet un contrôle explicite de la vectorisation pour le traitement parallèle des données.
- La cinquième version de l'API de concurrence structurée, qui simplifie le développement d'applications multithread en traitant plusieurs tâches exécutées sur différents threads comme une seule unité, a été publiée pour être testée.
- Le moteur de correspondance de motifs introduit une troisième version de la fonctionnalité pour permettre l'utilisation de types primitifs (int, byte, char et autres types de base non-objets) dans tous les types de modèles, l'opérateur instanceof et les blocs switch. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { … b … }
- JDK Flight Recorder (JFR) ajoute une prise en charge expérimentale du profilage avec un suivi plus précis de la consommation des ressources du processeur sur la plateforme. LinuxLes informations relatives au temps d'exécution des différentes structures peuvent être clairement visualisées à l'aide de diagrammes FlameGraph en couleur.
- Amélioration de la stabilité de JDK Flight Recorder (JFR) lors de l'échantillonnage asynchrone des piles de threads Java en parcourant la pile d'appels uniquement aux points de sécurité.
- JDK Flight Recorder (JFR) a été mis à jour avec de nouvelles fonctionnalités de traçage et de chronométrage des méthodes. Il permet de tracer la pile d'appels de méthodes spécifiques et d'enregistrer des statistiques précises sur les appels, couvrant des indicateurs tels que le temps d'exécution et le nombre d'appels.
Source: opennet.ru
