Java 11 : quoi de neuf ?

Java 11 : quoi de neuf ?

Maintenant que Java 11 est sorti, c’est le moment de faire le tour des fonctionnalités qu’apporte cette version, à nous, les développeurs.

Cet article fait partie d’une suite d’article sur les nouveautés des dernières version de Java, pour ceux qui voudraient les lires en voici les liens : Java 10, et Java 9.

Long Term Support

Java 11 est la première version de Java qui sera Long Term Support – LTS, donc supporté trois ans, jusqu’à la prochaine LTS qui sera Java 17. Le rythme des LTS étant d’une version tous les 3 ans. Java 8 reste supporté quand à lui jusqu’à janvier 2019 pour une utilisation commerciale, et décembre 2020 pour une utilisation personnelle (sinon : il faut payer le support d’Oracle qui est assez abordable : 25$/mois/cpu core).

Avec l’arrivée de Java 11, Java 10 ne sera plus supporté, c’est le nouveau model de support de Java d’Oracle. Mais, bonne chose pour nous, les builds du JDK d’Oracle et d’OpenJDK seront identique à partir de la version 11, libre à d’autres éditeurs de délivrer des versions de Java avec un support plus étendu …

De plus le build d’OpenJDK étant une simple archive il est plus simple d’utilisation, je vous le conseille donc, il peut être trouvé ici : http://jdk.java.net/11

Il y a eu beaucoup de bruit autour des différents build de Java et du nouveau model de support, pour plus d’info se référer à la réponse faite par des experts reconnu de la communauté : Java is still free.

Les JEP

Les JEP (Java Enhancement Process) qui ont été inclues dans Java 11 peuvent être trouvées ici : http://openjdk.java.net/projects/jdk/11/ quand on les regardes, pas grand chose de nouveau pour les développeurs, quelques API supprimées que personne n’utilisait, support de TLS 1.3, et pas mal de JEP assez technique dans les rangs desquels on trouve quand même deux nouveaux Garbage Collector (Epsilon et ZGC), qui viennent s’ajouter aux 4 déjà existant (serial, parallel, CMS, G1). Je reviendrais sur ces nouveau GC plus bas.

Trois JEP valent quand même le coup d’être citées:

  • JEP 323 : Local-Variable Syntax for Lambda Parameters : permet l’utilisation du mot clé var arrivé en Java 10 dans les signatures des lambdas. L’intérêt est principalement son utilisation avec des modificateurs de visibilités et des annotations. En effet, on peut omettre le type des paramètres des lambdas quand le compilateur peut l’inférer donc pas d’intérêt à var quand on n’a pas de modificateur ou d’annotation; mais si on en as, alors var va remplacer le type du paramètre qui aurait été obligatoire.
  • JEP 321 : HTTP Client (Standard) : le nouveau client HTTP développé dans Java 9 est passé du statu d’incubateur à une API mature dans son propre package (java.net.http) au passage son implémentation a été totalement revue. Il supporte HTTP/2 et propose une API totalement asynchrone.
  • JEP 330 : Launch Single-File Source-Code Programs : après JShell qui offrait un shell à Java voici la JEP 330 qui permet de lancer un programme Java basique (en un seul fichier) sans le compiler! Le but étant toujours de réduire le cérémonial nécessaire pour faire tourner Java. La commande java permet directement de lancer un programme java (un fichier avec l’extension .java) il va alors le compiler en mémoire et le lancer. On peut même utiliser le principe du shebang sous Linux pour rendre un fichier Java exécutable, ex:  #!/usr/bin/java

Les GCs

Deux nouveaux GC ont donc été intégrés dans Java 11:

  • JEP 318 : Epsilon: A No-Op Garbage Collector : ce GC a été développé par Aleksey Shipilev en quelques heures dans le but de prototyper un GC qui ne fait rien : il ne gère pas la mémoire, il alloue juste de la mémoire à chaque création d’objet, et quand il n’y a plus de mémoire, la JVM s’arrête! Ce GC a été conçu pour les gens désirant expérimenter dans le domaine des GC.
  • JEP 333 : ZGC: A Scalable Low-Latency Garbage Collector : ce GC tout droit sorti des laboratoires d’Oracle se veut d’une nouvelle génération de GC pouvant atteindre des performances très élevées avec des heap de très grandes tailles (10ms max de pause avec des heap pouvant aller jusqu’au To) en sacrifiant bien sur un peut de mémoire et de CPU au passage ;). Encore à un stade expérimental il ne se veut pas le remplaçant de G1 mais cible les applications ayant besoin de beaucoup de mémoire.

En plus de ces deux nouveaux GC, il y a eu beaucoup d’optimisation réalisé au sein de G1 qui est le GC par défaut dans Java depuis la version 9, celons l’auteur d’une partie de ces changements, en passant à Java 11 depuis Java 8, on aurait des pauses 60% plus basse « gratuitement » pour une utilisation mémoire grandement réduite.

Plus d’information sur ces changement ici : http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2018-June/002759.html

Les changements au sein de l’API Java :

Même si il n’y a pas de grands changements en terme d’API Java dans la version 11, et pas beaucoup de JEP axés développeurs, on peut noter pas mal de petit changements qui viendront nous simplifier la vie :

  • JDK-8137326 : Méthodes pour comparer des CharSequence, StringBuilder, et StringBuffer : ajout de compareTo().
  • JDK-8196298 : Ajout d’implémentation no-op à Reader et Writer : Reader.nullReader() et Writer.nullWriter().
  • JDK-8139206 : InputStream.readNBytes(int len).
  • JDK-8184692 : Pattern.asMatchPredicate : crée un prédicat qui test si le pattern match la String en paramètre.
  • JDK-8184693 : Optional.isEmpty() : retourne true si la valeur n’est pas présente.
  • JDK-8201276 : Ajout de méthodes à Files pour lire/écrire depuis une String.
  • JDK-8202385 : Création de l’annotation java.io.Serial qui permet de marquer une méthode comme relative à la sérialisation.
  • JDK-8050818 : Predicate.not() : négation d’un prédicat.
  • JDK-8204375 : TimeUnit.convert(Duration) : conversion d’une Duration vers une TimeUnit.
  • JDK-8202216 : Ajout d’une méthode compareToUnsigned (buffer mismatch) à java.nio.*Buffer.
  • JDK-8201593 : Affichage de la taille du tableau dans le message de l’exception ArrayIndexOutOfBoundsException.
  • JDK-8060192 : Ajout d’un méthode Collection.toArray(). Pour ne pas risquer de problème de compatibilité, une version par défaut a été fournie.

L’API String a vu l’ajout de pas mal de nouvelles méthodes, et d’autres sont en préparation pour Java 12 pour le support des Raw String :

  • JDK-8197594 : String::repeat : créé une String qui est la répétition de la String sur laquelle la méthode est appelée.
  • JDK-8198837 : Character::toString(int) : créé une String depuis un caractère donné via un int (un code point).
  • JDK-8200377 : String::strip, String::stripLeading, String::stripTrailing : créé une String en retirant les espaces (tel que définit par Character.isWhitespace) de la String sur laquelle la méthode est appelée.
  • JDK-8200436 : String::isBlank : retourne true si la String est vide ou ne contient que des espaces (tel que définit par Character.isWhitespace).
  • JDK-8200380 : String::lines : retourne une Stream avec les lignes de la String. Plus performant que String.split car réalise le split de manière lazy.

Pour aller plus loin, un article quasiment exhaustif de tous les changements (en anglais) : https://www.azul.com/90-new-features-and-apis-in-jdk-11/ 

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.