Après six mois de développement, Oracle a publié la plateforme Java SE 25 (Java Platform, Standard Edition 24), dont l'implémentation de référence est basée sur le projet open source OpenJDK. À l'exception de la suppression de certaines fonctionnalités obsolètes, Java SE 25 conserve la compatibilité avec les versions précédentes de la plateforme Java — la plupart des projets Java précédemment écrits fonctionneront sans modifications sous la nouvelle version. Les versions prêtes à installer de Java SE 25 (JDK, JRE et Server JRE) sont préparées pour Linux (x86_64, AArch64), Windows (x86_64) et macOS (x86_64, AArch64). L'implémentation de référence de Java SE 25, développée dans le cadre du projet OpenJDK, est complètement ouverte sous la licence GPLv2 avec des exceptions GNU ClassPath, permettant la liaison dynamique avec des produits commerciaux.
Java SE 25 est classé parmi les versions avec un support prolongé, avec des mises à jour qui seront publiées jusqu'en 2033 (les mises à jour publiques seront disponibles jusqu'en septembre 2030). Les branches Java SE 17 et 21 continuent également d'être prises en charge en tant que version à long terme (LTS), avec des mises à jour disponibles jusqu'en 2029 et 2031, respectivement (publiques jusqu'en 2026 et 2028). Le support prolongé pour les branches LTS de Java SE 8 et 11 se poursuivra jusqu'en 2030 et 2032.
Parmi les nouveautés proposées dans Java SE 25 (1, 2, 3, 4) :
- Un API expérimental StableValue a été ajouté pour traiter les objets contenant des données immuables, qui sont gérées dans la JVM comme des constantes. De telles optimisations de performance, similaires aux champs avec le mot-clé « final », s'appliquent à ces objets. L'API StableValue sépare la création de valeurs constantes de leur initialisation, garantissant que la valeur ne peut être initialisée qu'une seule fois, réduit le temps de démarrage des programmes et permet d'appliquer dans le code utilisateur les optimisations de réduction de constantes (constant-folding), qui étaient auparavant utilisées uniquement dans le code interne du JDK. class Application { // C'était : // static final UserService USERS = new UserService(); // Devenu : static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- Un API expérimental pour l'encodage et le décodage d'objets contenant des clés cryptographiques, des certificats et des listes de certificats révoqués a été ajouté, utilisant le format PEM (Pivacy-Enhanced Mail).
- Ajout du support des valeurs limitées (Scoped Values), permettant de partager des données immuables entre des threads et d'échanger efficacement des données entre des sous-threads (les valeurs sont héritées). Les Scoped Values se développent pour remplacer le mécanisme des variables locales au thread (thread-local variables) et sont plus efficaces lorsqu'il s'agit d'utiliser un très grand nombre de threads virtuels (des milliers ou des millions de threads). La principale différence entre les Scoped Values et les variables locales au thread est que les premières sont écrites une fois, ne peuvent pas être modifiées par la suite et restent accessibles uniquement pendant l'exécution du thread.
- Ajout d'une API pour utiliser les fonctions cryptographiques de dérivation de clé (KDF, key derivation function), permettant de générer des clés supplémentaires de la longueur requise à partir d'une clé secrète (par exemple, un mot de passe) et d'un ensemble de données arbitraire.
- Suppression du code et des scripts de construction pour le support des systèmes 32 bits x86. L'arrêt du support des systèmes 32 bits x86 a permis de simplifier l'infrastructure de construction et de test du JDK, ainsi que de mettre en œuvre des fonctionnalités liées à des plateformes sans avoir à créer de gestionnaires de secours pour les systèmes 32 bits x86.
- Ajout de la possibilité d'utiliser une seule expression « import module M » pour importer immédiatement tous les paquets exportés par le module spécifié. Ce changement facilite considérablement la réutilisation des bibliothèques modulaires, permettant de connecter des bibliothèques et des classes sans avoir à définir leur emplacement dans la hiérarchie des paquets. Par exemple, indiquer « import module java.base » entraînera l'importation de tous les 54 paquets inclus dans le module java.base, qui auparavant auraient dû être mentionnés séparément (« import java.io.* », « import java.util.* », etc.).
- Proposition d'une variante compacte pour la rédaction de programmes, qui peut s'avérer utile pour l'apprentissage et lors du développement de petites applications. Sous cette forme compacte, aucune définition de classes superflues n'est requise, les API standard sont automatiquement importées et des méthodes simplifiées d'entrée/sortie sont accessibles. Par exemple, l'application « Hello, World! » peut être réduite à : void main() { IO.println(« Hello, World! »); }
- Il est permis d'indiquer dans les constructeurs d'expressions avant l'appel de super(…), utilisé pour appeler explicitement le constructeur de la classe parente depuis le constructeur de la classe dérivée, si ces expressions ne font pas référence à l'instance créée par le constructeur. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Un mode de fonctionnement génératif a été ajouté au ramasse-miettes Shenandoah, dans lequel les objets anciens et récemment créés sont traités séparément pour améliorer l'efficacité de nettoyage des objets avec une courte durée de vie. Ce nouveau mode garantit une bande passante plus prévisible, une résilience face aux variations de charge et une réduction de la consommation mémoire lors de la collecte des ordures. Le planificateur Shenandoah vise à réduire le temps d'arrêt pendant la collecte des ordures en effectuant un plus grand volume de travail en parallèle avec l'exécution des applications Java.
- La création de caches pour le chargement anticipé (Ahead-of-Time) et la composition des classes a été simplifiée, permettant d'accélérer le démarrage de la JVM HotSpot en utilisant des classes déjà chargées et composées. Lors du démarrage, il n'est plus nécessaire d'effectuer des opérations distinctes pour enregistrer l'activité et créer le cache, une seule commande suffit : java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
- Au démarrage de la JVM HotSpot, il est désormais possible d'utiliser les profils d'exécution des méthodes obtenus lors du dernier lancement de l'application. Ce changement permet au compilateur JIT de se passer de l'accumulation de statistiques et de commencer immédiatement à générer du code natif sans attendre la formation du profil.
- La JVM HotSpot prend en charge les en-têtes d'objets compacts, dont la taille a été réduite de 96 à 64 bits (de 12 à 8 octets) sur les systèmes 64 bits. La réduction de la taille des en-têtes permet de diminuer la taille du tas et d'améliorer l'efficacité du cache.
- Une implémentation de test de l'API Vector a été proposée, fournissant des fonctionnalités pour les calculs vectoriels, qui sont effectués à l'aide des instructions vectorielles des processeurs x86_64 et AArch64, permettant d'appliquer simultanément des opérations à plusieurs valeurs (SIMD). Contrairement aux capacités d'auto-vectorisation des opérations scalaires fournies par le compilateur JIT HotSpot, la nouvelle API permet de gérer explicitement la vectorisation pour le traitement parallèle des données.
- Un cinquième pré-version de l'API pour la concurrence structurée a été proposé pour test, simplifiant le développement d'applications multithreads en traitant plusieurs tâches s'exécutant dans différents threads comme un seul bloc.
- Dans le mécanisme de correspondance de modèle, une troisième pré-version pour l'utilisation de types primitifs (int, byte, char et d'autres types de base non objets) a été proposée dans tous les types de modèles, dans l'opérateur «instanceof» et dans les blocs «switch». switch (x.getStatus()) { case 0 -> «okay»; case 1 -> «warning»; case 2 -> «error»; case int i -> «status inconnu: » + i; } if (i instanceof byte b) { … b … }
- Un support expérimental pour le profilage avec un suivi plus précis de la consommation des ressources CPU sur la plateforme Linux a été ajouté au JDK Flight Recorder (JFR). Les informations sur le temps d'exécution de diverses constructions peuvent être visualisées de manière intuitive à l'aide de diagrammes en couleur «FlameGraph».
- La stabilité du fonctionnement du JDK Flight Recorder (JFR) a été améliorée lors de l'échantillonnage asynchrone des piles des threads Java grâce à l'itération des piles d'appels uniquement aux «points sûrs» (safepoints).
- Des outils de traçabilité et d'évaluation du temps d'exécution des méthodes ont été ajoutés au JDK Flight Recorder (JFR). Le traçage de la pile d'appels de méthodes spécifiques et l'enregistrement de statistiques précises sur les appels de méthodes, couvrant des métriques telles que le temps d'exécution et le nombre d'appels, sont pris en charge.
Source : opennet.ru
