Les nouveautés de Java 12

plus de 4 an(s)

Description

Avec plus de 12 millions de développeur dans le monde, Java continue à être un langage de de programmation de premier choix.  Avec l’arrivée de Java 12 dans les temps tel que planifié par Oracle la plateforme reste bien positionnée pour les développements modernes et continue son développement pour le cloud.

Depuis la sortie de java 9 en 2017, la cadence de versioning de la plateforme est de 3 ans pour les versions importantes et de 6 mois pour les versions intermédiaires.

Ainsi tous les mois de mars et de septembre de nouvelles fonctionnalités sont dévoilés aux développeurs, leurs offrant la possibilité d’intégrer les nouveautés au fur à mesure.

Java 12 est sortie le 19 mars 2019,  c’est une version intermédiaire, elle apporte huit améliorations que nous allons découvrir dans cet article.

JEP 325 – Switch Expressions

C’est une amélioration du langage de programmation qui permet de simplifier l’écriture d’un expression  Switch.

Exemple :

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;

Avec Java 12, le nouveau switch

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); 

 

Le nouveau permet également de renvoyer une valeur comme suit :

int numLetters = switch (day)  
    case MONDAY, FRIDAY, SUNDAY -> 6; 
    case TUESDAY                -> 7; 
    case THURSDAY, SATURDAY     -> 8; 
    case WEDNESDAY              -> 9; 
;

Cette fonctionnalité permettra de faciliter la vie aux développeurs et offre la possibilité d’utiliser le pattern matching (JEP 305)

JEP-344 Abortable Mixed Collections for G1 :

Cette fonctionnalité permet l’annulation du processus de récupération de mémoire si elle risque de dépasser le temps de pause cible définit par l’utilisateur. Lors du temps de pause la JVM , G1 sectionne un ensemble de zone mémoire et tous les objets de ces zones doivent être récupérer en une seul fois sans interruption, en fonction de la taille des zones, la récupération de la mémoire peut ainsi dépasser le temps pause défini.

Pour cela, les 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é.

Pour en savoir plus http://openjdk.java.net/jeps/344

JEP-346 : Renvoi immédiat de la mémoire non utilisé au système

Cette fonctionnalité est une amélioration du Garbage collector G1, afin de renvoyer immédiatement la mémoire heap au système d’exploitation après une période de faible activité de l’application.

Le renvoi de mémoire était effectué qu’après une Full GC ou durant les cycles de concurrence de la JVM, ce processus implique entre autres l’arrêt de la hotspot.de  le Garbage G1   

G1 ne renvoyait la mémoire au système d’exploitation qu’après un Full GC ou de cycle de concurrence (pendant un Safe point par exemple), mais le Garbage G1 essaye au maximum d’éviter à faire un Full GC et ne lance un cycle concurrent seulement en fonction du niveau d’occupation de la mémoire et de l’activité de l’application. 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.

Ce comportement est particulièrement désavantageux pour les environnements (cloud) qui utilisent des containers ou en générale les ressources sont facturées à l’utilisation même en période d’inactivité.

Il existe éventuellement d’autres méthodes pour forcer le renvoie de la mémoire non utilise, pour en savoir plus http://openjdk.java.net/jeps/346

 

JEP 189 – Shenandoah, un ramasse-miette à faible temps de pause(en expérimentation)

Est 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. 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.

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. 

Pour activer la fonctionnalité, il utilisé la commande

-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC.

pour en savoir plus sur l’utilisation Shenandoah voire la page wiki dédiée https://wiki.openjdk.java.net/display/shenandoah/Main

Pour en savoir plus http://openjdk.java.net/jeps/189

 

JEP 230 – Microbenchmark Suite

Ajout une suite de microbenchmarks basiques au code source de la JDK pour permettre aux développeurs d’utiliser celle existant ou d’en créer de nouveaux. (http://openjdk.java.net/jeps/230 )

 

JEP 334 – JVM Constants API

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.

Cette fonctionnalité est à la base une sous-fonctionnalité de la JEP 303 (Intrinsics for the LDC and INVOKEDYNAMIC Instructions)

Pour plus d’informations : http://openjdk.java.net/jeps/334

JEP 340 - One AArch64 Port, Not Two

Suppression du code sources du port  arm64 tout en gardant le port  32-bit ARM et le port 64-bit aarch64 pour permettre aux contributeurs de se focaliser à l’amélioration d’une seule implémentation et éviter le double de maintenance de deux architectures.

Pour plus d’information : http://openjdk.java.net/jeps/340

JEP 341 – Default CDS Archives

Cette fonctionnalité est une suite de la JEP 301, permet de réduire le temps de démarrage et l'empreinte mémoire en partageant les métadonnées des classes communs à travers différents processus java dans un fichier archive CDS. Avec java 12, cette fonctionnalité est activée par défaut, plus obligé d’utiliser la commande -Xshare:dump pour profiter du CDS.

Pour plus d’informations : http://openjdk.java.net/jeps/341