Java, quelles nouveautés dans le JDK 16 ?

La nouvelle version des logiciels open-source Java 16 (Java SE 16) et Java Development Kit 16 (JDK 16) est désormais en phase de « Release Candidate ». L’ensemble des fonctionnalités qui seront disponibles a été fixé et aucun nouveau JEP (document présentant des propositions d’améliorations) ne sera étudié pour cette nouvelle version. Oracle, société éditrice du JDK et de Java SE a donc mis à jour les nouveautés de la version 16 avant sa mise à disposition prévue pour fin mars. Découvrez dans cet article les principales nouveautés du JDK 16.

Une API vectorielle améliorée

Une API vectorielle existait déjà dans les précédentes versions du JDK. Elle offrait un mécanisme d’écriture d’algorithmes vectoriels complexes grâce au support d’HotSpot, une machine virtuelle prenant en charge la vectorisation automatique. Mais, dans certains cas, le  développeur ne pouvait pas coder d’opérations complexes. La nouvelle API vectorielle de la version 16 vise à combler ces lacunes en fournissant de nouveaux mécanismes pour écrire des algorithmes vectoriels en Java. Pour cela, elle utilise le support préexistant dans HotSpot pour la vectorisation, mais en y ajoutant un modèle utilisateur qui la rend beaucoup plus prévisible et robuste. 

Cette API vectorielle était très attendue notamment dans les domaines du deep learning, de  la cryptographie, et de la finance. Elle devrait également être totalement indépendante de la plateforme matérielle. En effet, dans les API Java, l’optimisation de la plateforme et la portabilité entrent souvent en conflit. Dans le JDK 16, l’application vectorielle devrait résoudre cette situation en étant « portable ». 

Le traitement de pile de threads simultané avec ZGC 

Le « ZGC » pour « Z Garbage Collector » est un « ramasseur de miettes » évolutif et à faible latence. Il n’est pas rare que des applications soient utilisées par des milliers d’utilisateurs simultanément. Leur fonctionnement nécessite alors d’énormes quantités de mémoire. Cependant, la gestion de toute cette mémoire peut rapidement avoir un impact sur les performances des applications. Pour résoudre ce problème, Java a introduit , dès sa version 11 le ZGC en tant qu’implémentation expérimentale du garbage collector (GC).

La version 2016 a pour but de diminuer encore la latence du ZGC en déplaçant la majorité des opérations du garbage collector ( marquage, relocalisation, traitement des références, déchargement de classe, etc.) hors des points de restauration. Ces opérations se feront désormais dans des étapes simultanées, les temps de pause du GC ne devraient ainsi plus dépasser les 10 ms. 

Le packaging tool sort d’incubation avec le JDK 16

Le « packaging tool » est un outil destiné à créer et gérer les packages pour les applications Java autonomes. Implémenté en mode  « incubation » dans le JDK 14, il n’était pas passé en production dans le JDK 15. Mais ce sera désormais le cas dans la version 16.

Il devrait notamment prendre en charge les formats de package natifs (Windows et Linux) pour permettre une installation plus simple pour les utilisateurs finaux. Il permettra notamment de spécifier des paramètres de lancement dans le package et de l’appeler directement via une ligne de commande ou un programme (grâce à l’ API Tool Provider). 

Une API Foreign Linker en incubation 

Une nouvelle API de « liaison étrangère » fait son apparition dans le JDK 16. Pour l’instant elle restera en phase d’incubation mais offrira un accès purement Java de type statique au code natif. Elle devrait ainsi grandement simplifier la liaison à une bibliothèque native. À terme, elle pourrait même remplacer la JNI (Java Native Interface), une bibliothèque logicielle d’interfaçage permettant au code Java qui s’exécute à l’intérieur de la JVM d’appeler et d’être appelé par des applications natives.

L’objectif final est de rendre cette nouvelle API suffisamment fiable et flexible pour prendre en charge d’autres plateformes telles que le 32 bits et des fonctions étrangères écrites en d’autres langages de programmations, notamment C et C ++. Ses performances devront être meilleures ou au moins égales à celles de la JNI actuelle.

À noter que le JDK 16 fournira également une prise en charge des fonctionnalités du langage C++ dans le code source  (JEP 347).

Un allocateur de mémoire élastique

Depuis sa création dans le JEP 122, l’allocateur de mémoire ou metaspace Java est réputé pour son utilisation élevée de la mémoire hors tas. Ce gaspillage de mémoire pouvait alors engendrer des problèmes de performances voire de fonctionnement pour les applications complexes.

En effet, la JVM (Machine Virtuelle Java) définit plusieurs zones de données qui sont utilisées pendant l’exécution d’un programme. Certaines zones sont créées par la JVM elle-même tandis que d’autres proviennent des threads utilisés dans un programme. Cependant, si les zones de données du thread sont détruites lorsqu’il se termine, celles créées par la JVM ne sont supprimées que lorsqu’elle se ferme. 

L’allocateur de mémoire élastique permettra de libérer plus rapidement la mémoire inutilisée de la classe HotSpot VM (metaspace). À terme, l’allocateur existant pourrait être remplacé par un système doté d’un algorithme qui divisera la mémoire en partitions. Cette approche, déjà utilisée notamment pour le noyau Linux offre la possibilité d’allouer la mémoire en plus petites portions afin de diminuer la surcharge des chargeurs de classe. Afin d’exploiter pleinement cette élasticité,  la mémoire de l’allocateur sera divisée en éléments de taille uniforme qui pourront être alloués et restitués indépendamment les uns des autres.

Une nouvelle incubation de l’API d’accès à la mémoire étrangère

L’API d’accès à la mémoire étrangère, incubée dans les JDK 14 et 15, le sera de nouveau dans le JDK 16, avec toutefois des améliorations notables.

Les API d’accès à la mémoire étrangère permettent aux programmes Java comme Ignite, mapDB, ou encore Memcached, d’accéder en toute sécurité à la mémoire en dehors du tas Java.

La nouvelle API a pour objectif de permettre à plusieurs processus de partager la mémoire et de sérialiser les données en mappant les fichiers.

Cette nouvelle version du JDK est donc orientée vers l’amélioration d’anciennes fonctionnalités telles que l’API vectorielle et le ZGC. Elle marque aussi une volonté d’ouvrir le JDK à d’autres plateformes, langages et programmes.

Et vous quelles fonctionnalités attendiez-vous dans ce JDK 16 ? Que pensez-vous des nouveautés de cette version ? N’hésitez pas à nous faire part de vos avis sur le forum.

Liste officielle des nouveautés du JDK 16 :

https://openjdk.java.net/projects/jdk/16/
Proudly powered by WordPress   Premium Style Theme by www.gopiplus.com