La nouvelle version apporte un certain nombre de nouvelles fonctionnalités et d’améliorations remarquables. Plus précisément, Java 12 inclut une nouvelle fonctionnalité de langage, les expressions Switch (en préversion), un nouveau récupérateur de mémoire à faible temps de pause appelé Shenandoah (expérimental) et diverses améliorations au récupérateur de mémoire par défaut Garbage First (G1). En tout, Java 12 introduit huit principales améliorations (JEP) que nous présentons ici.
Expressions Switch
Cette fonctionnalité en préversion étend l'instruction Switch afin qu'elle puisse être utilisée également en tant qu'expression. Le Switch n'est donc plus juste une structure de contrôle (comme les if/else), mais peut maintenant renvoyer une valeur. Avec cette fonctionnalité vient aussi une nouvelle syntaxe plus pratique et plus concise qui utilise l'opérateur arrow (->), et qui supprime le besoin d’instructions break. Précisons que seul le code à droite de -> est exécuté.
Ci-dessous un exemple de code avec le Switch classique : les nombreuses instructions break dans le code le rendent inutilement verbeux, ce qui peut souvent masquer des erreurs de débogage difficiles à identifier.
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | switch (day) { case MONDAY: case FRIDAY: case SUNDAY: System.out.println(6); break; case TUESDAY: System.out.println(7); break; case THURSDAY: case SATURDAY: System.out.println(8); break; case WEDNESDAY: System.out.println(9); break; } |
Le code précédent peut être réécrit comme suit avec la nouvelle syntaxe utilisant -> et sans break :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 | switch (day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); case TUESDAY -> System.out.println(7); case THURSDAY, SATURDAY -> System.out.println(8); case WEDNESDAY -> System.out.println(9); } |
Code avec expression Switch :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 | int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; |
Collectes mixtes annulables pour G1
Il s'agit ici de pouvoir avorter les collectes G1 mixtes si elles risquent de dépasser la cible de pause. Si cela est nécessaire pour respecter la cible de temps de pause fournie par l'utilisateur, G1 (Garbage First) sera en effet contraint d'abandonner le processus de récupération de mémoire. Pour cela, le jeu de régions dans lesquelles la récupération de mémoire sera effectuée est divisé en parties obligatoires et facultatives. Ce qui permet à G1 d'avorter le processus de récupération des parties facultatives si le temps de pause n’est pas respecté.
Renvoi immédiat de la mémoire non utilisée par G1 au système d'exploitation
Java 12 améliore le récupérateur de mémoire G1 afin de renvoyer automatiquement le tas Java (la mémoire heap) au système d'exploitation. Il s'agissait en effet de faire en sorte que G1 renvoie les zones de mémoire collectées au système d'exploitation après une période de faible activité de l'application. Jusqu'à présent, G1 ne renvoyait la mémoire au système d’exploitation qu’après un Full GC, chose qu’il évitait d'ailleurs, car l'un des objectifs d’une JVM correctement paramétrée est d’avoir le moins de Full GC possible. Ce qui fait qu'en général, le récupérateur de mémoire G1 ne retournait pas du tout la mémoire effacée vers le système d’exploitation.
Archives CDS par défaut
Class Data Sharing (CDS) est une fonctionnalité de la JVM qui permet de réduire le temps de démarrage de celle-ci, en enregistrant dans un fichier les métadonnées des classes pour une réutilisation lors du prochain lancement de la JVM. Toutefois, si vous n'installez pas le JRE avec le programme d'installation, l'archive CDS n'est pas générée par défaut et la commande java -Xshare:dump doit être exécutée manuellement. Dans Java 12, les archives CDS seront générées par défaut sur les plateformes 64 bits, pas besoin d’argument spécifique dans la ligne de commande.
Un seul port ciblant l'architecture ARM 64 bits
Il existe deux ensembles différents de codes source (donc de ports) ciblant ARM 64 bits dans le JDK. L'un, fourni par Oracle, est arm64 (disponible dans le répertoire src/hotspot/cpu/arm) et l'autre est aarch64 (disponible dans le répertoire open/src/hotspot/cpu/aarch64). Dans Java 12, il y aura désormais un seul port ciblant l'architecture ARM 64 bits. Toutes les sources liées au port arm64 ont été supprimées tout en conservant le port ARM 32 bits et le port aarch64. La suppression d'un port 64 bits permettra à tous les contributeurs de concentrer leurs efforts sur une implémentation ARM 64 bits unique et d’éliminer le travail en double requis pour la maintenance de deux ports.
API de constantes JVM
Java 12 introduit une API pour modéliser les descriptions nominales des fichiers de classe clé et artefacts de runtime, en particulier des constantes pouvant être chargées à partir du pool de constantes.
Shenandoah, un ramasse-miettes à faible temps de pause
Java 12 ajoute un nouvel algorithme de récupération de mémoire réduisant les temps de pause du GC en effectuant le travail d'évacuation en même temps que les threads Java en cours d'exécution. Développé par Redhat et déjà inclus depuis plusieurs mois dans leur JVM, Shenandoah est intégré en tant que fonctionnalité expérimentale dans Java 12. Les temps de pause avec Shenandoah sont indépendants de la taille du tas, ce qui signifie que vous aurez les mêmes temps de pause, que votre tas soit de 200 Mo ou de 200 Go.
Suite de microbenchmarks
Java 12 vient avec une suite de base de microbenchmarks introduite au code du JDK. Les développeurs peuvent facilement exécuter les microbenchmarks existants et en créer de nouveaux.
Pas de littéraux de chaîne bruts (Raw String Literals)
Enfin, rappelons que les littéraux de chaîne bruts (Raw String Literals) ont été supprimées du JDK 12. Les littéraux de chaîne bruts facilitent l'utilisation de chaînes contenant des caractères spéciaux et des chaînes multilignes. Ils sont créés avec le symbole backtick (accent grave) : `. Il s'agissait également d'introduire la fonction String::align pour faciliter l’utilisation de texte multiligne indenté et les fonctions unescape/escape pour les conversions vers ou à partir de littéraux de chaîne (traditionnels). Mais cette fonctionnalité qui était prévue pour le JDK 12 a été supprimée au dernier moment. Elle pourrait réapparaître dans les versions à venir.
Source : Blog Oracle
Et vous ?
Que pensez-vous des nouveautés et améliorations de Java 12 ?
Lesquelles appréciez-vous le plus et pourquoi ?
Comptez-vous migrer vers cette version ou attendre la prochaine LTS ?
Voir aussi :
JavaFX disponible en version 12, la boite à outils graphique suit l'évolution de Java
Quelle version de Java utilisez-vous ? Qu'est-ce qui vous empêche de migrer vers une version plus récente ?
Java : une version à accès anticipé du JDK 13 est publiée, Oracle veut unifier les deux méthodes de la classe GraphicsEnvironment
Java : Oracle publie la première release candidate du JDK 12, avec toutes les fonctionnalités majeures annoncées sauf les littéraux de chaînes bruts
Quelles implémentations JPA (Java Persistence API) utilisez-vous et pourquoi ? Partagez votre expérience