{"id":1877,"date":"2025-01-10T15:07:14","date_gmt":"2025-01-10T14:07:14","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1877"},"modified":"2025-06-03T12:40:57","modified_gmt":"2025-06-03T10:40:57","slug":"java-24-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-24-quoi-de-neuf\/","title":{"rendered":"Java 24 : quoi de neuf ?"},"content":{"rendered":"<p>Maintenant que Java 24 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs.<\/p>\n<p>Cet article fait partie d\u2019une suite d\u2019article sur les <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/tag\/whatsnew\/\">nouveaut\u00e9s des derni\u00e8res versions de Java<\/a>, pour ceux qui voudraient les lire en voici les liens : <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-23-quoi-de-neuf\/\">Java 23<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-22-quoi-de-neuf\/\">Java 22<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-21-quoi-de-neuf\/\">Java 21<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-20-quoi-de-neuf\/\">Java 20<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-19-quoi-de-neuf\/\">Java 19<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-18-quoi-de-neuf\/\">Java 18<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-17-quoi-de-neuf\/\">Java 17<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-16-quoi-de-neuf\/\">Java 16<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-15-quoi-de-neuf\/\">Java 15<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-14-quoi-de-neuf\/\">Java 14<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-13-quoi-de-neuf\/\">Java 13<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-12-quoi-de-neuf\/\">Java 12<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-11-quoi-de-neuf\/\">Java 11<\/a>,\u00a0<a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-10-quoi-de-neuf\/\">Java 10,<\/a>\u00a0et\u00a0<a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\/\">Java 9<\/a>.<\/p>\n<p>Java 24 contient par moins de 24 JEP, c&rsquo;est un record et surtout un chiffre \u00e9ponyme !<\/p>\n<h2>JEP 404: Generational Shenandoah (Experimental)<\/h2>\n<p>Shenandoah est un Garbage Collector (GC) initialement d\u00e9velopp\u00e9 par RedHat et inclus dans OpenJDK. Il r\u00e9duit les temps de pause du GC en effectuant le travail d&rsquo;\u00e9vacuation en m\u00eame temps que les threads applicatifs en cours d&rsquo;ex\u00e9cution.<\/p>\n<p>Jusqu&rsquo;ici, Shenandoah n&rsquo;\u00e9tait pas g\u00e9n\u00e9rationnel, ce qui veut dire qu&rsquo;il ne s\u00e9parait pas la heap en plusieurs zones contenant des objets d&rsquo;age diff\u00e9rent. Les GC g\u00e9n\u00e9rationnels se basent sur la <strong>Weak Generational Hypotesis<\/strong> : <em>most objects die young<\/em>, comme collecter un objet mort est tr\u00e8s peu co\u00fbteux, s\u00e9parer les objets jeunes des objets vieux permet de se focaliser sur les objets jeunes pour nettoyer la heap de mani\u00e8re plus performante.<\/p>\n<p>Tous les GC actuels sont g\u00e9n\u00e9rationnels, m\u00eame ZGC qui ne l&rsquo;\u00e9tait pas \u00e0 ses d\u00e9buts, mais qui depuis cette release ne supporte plus que le mode g\u00e9n\u00e9rationnel. Shenandoah en ajoutant un mode g\u00e9n\u00e9rationnel en exp\u00e9rimental comble son retard.<\/p>\n<p>Shenandoah est un GC concurrent, cela a un co\u00fbt en termes d&rsquo;utilisation de ressources CPU et m\u00e9moire, un mode g\u00e9n\u00e9rationnel devrait permettre de mitiger le co\u00fbt de fonctionnement du GC tout en gardant un objectif de pause de l&rsquo;ordre de la milliseconde.<\/p>\n<p>Pour activer le mode g\u00e9n\u00e9rationnel, il faut utiliser les options JVM suivantes : <code>-XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCMode=generational<\/code>.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/404\" title=\"JEP 404\" rel=\"noopener\" target=\"_blank\">JEP 404<\/a>.<\/p>\n<h2>JEP 450: Compact Object Headers (Experimental)<\/h2>\n<p>Cette JEP provient du projet Liliput dont le but est de r\u00e9duire la taille du header des objets de 128 bits \u00e0 64 bits ou moins. C&rsquo;est d\u2019ailleurs tr\u00e8s exactement ce qu&rsquo;a d\u00e9livr\u00e9 la JEP 450 : un mode exp\u00e9rimental pour la JVM qui r\u00e9duit \u00e0 64 bits le header des objets.<\/p>\n<p>Chaque objet en Java a un header, puis de la <em>donn\u00e9es<\/em> : ses attributs. Si vous avez un objet <code>Point(int x, int y)<\/code>, bien qu&rsquo;un int utilise 32 bits, la taille de l\u2019objet Point va \u00eatre de 192 bits, car chaque objet stock dans sa r\u00e9f\u00e9rence un ensemble d&rsquo;information sur 128 bits.<\/p>\n<p>Les premiers 64 bits d&rsquo;un header sont nomm\u00e9s <em>Mark Word<\/em> et stockent soit le hash code, l&rsquo;\u00e2ge GC et certains flags n\u00e9cessaire pour la JVM; soit un pointeur vers une structure externe. Les derniers 64 bits sont nomm\u00e9s <em>Class Word<\/em> et stockent un pointeur vers la classe. Le mode sp\u00e9cial <em>Compressed Class Pointer<\/em> permet d\u00e9j\u00e0 de le r\u00e9duire \u00e0 32 bits, mais sur une architecture 64 bits, l&rsquo;alignement en m\u00e9moire fait que le gain n&rsquo;est pas forc\u00e9ment pr\u00e9sent m\u00eame si la JVM peut optimiser le layout d&rsquo;un objet en utilisant ces 32 bits ainsi lib\u00e9r\u00e9s.<\/p>\n<p>En activant les headers d&rsquo;objets compacts via les options JVM <code>-XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders<\/code>, la JVM va stocker le header des objets sur 64 bits : 22 bits pour le pointeur de classe, 31 bits pour le hash code, 4 bits r\u00e9serv\u00e9s pour Valhalla et les bits restant comme pr\u00e9c\u00e9demment pour l&rsquo;\u00e2ge GC et les flags de la JVM.<\/p>\n<p>Des tests pr\u00e9liminaires montrent une utilisation m\u00e9moire r\u00e9duite de 10 \u00e0 20 %.<\/p>\n<p>Amazon a r\u00e9alis\u00e9 des tests qui montrent que de nombreuses charges de travail b\u00e9n\u00e9ficient d&rsquo;une baisse de l&rsquo;utilisation CPU pouvant aller jusqu&rsquo;\u00e0 30 %.<\/p>\n<p>Il y a quelques limites \u00e0 ce mode, il ne peut supporter les heap de plus de 8TB (sauf pour ZGC) et se limite \u00e0 4 millions de classes.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/450\" title=\"JEP 450\" rel=\"noopener\" target=\"_blank\">JEP 450<\/a>.<\/p>\n<h2>JEP 472: Prepare to Restrict the Use of JNI<\/h2>\n<p>La JEP 472 restreint l&rsquo;utilisation la Java Native Interface (JNI) et ajuste l&rsquo;API Foreign Function and Memory (FFM) en cons\u00e9quence.<\/p>\n<p>L&rsquo;utilisation d&rsquo;une fonction native g\u00e9n\u00e9rera un WARNING au d\u00e9marrage de la JVM sauf si l&rsquo;option JVM <code>--enable-native-access<\/code> est utilis\u00e9e pour l&rsquo;autoriser. Il est aussi possible d&rsquo;utiliser l&rsquo;entr\u00e9e de manifest <code>Enable-Native-Acces<\/code>.<\/p>\n<p>L&rsquo;utilisation d&rsquo;une fonction native sans l&rsquo;avoir autoris\u00e9e au pr\u00e9alable est dite ill\u00e9gale, l&rsquo;option JVM <code>--illegal-native-access<\/code> permet de contr\u00f4ler le comportement de la JVM dans ces cas_l\u00e0. Elle a comme valeur par d\u00e9faut <code>warn<\/code>, et peut prendre les valeurs suivantes :<\/p>\n<ul><li><code>allow<\/code> : l&rsquo;utilisation est autoris\u00e9e sans restriction,<\/li>\n\n<li><code>warn<\/code> : le d\u00e9faut en Java 24, un warning sera \u00e9crit dans les logs de la JVM,<\/li>\n\n<li><code>deny<\/code> : l&rsquo;utilisation est refus\u00e9e, une exception <code>IllegalCallerException<\/code> sera lev\u00e9e.<\/li>\n<\/ul>\n<p>Exemple de warning g\u00e9n\u00e9ra par la JVM au chargement d&rsquo;une librairie native si l&rsquo;acc\u00e8s n&rsquo;a pas \u00e9t\u00e9 autoris\u00e9 :<\/p>\n<pre>\nWARNING: A restricted method in java.lang.System has been called\nWARNING: System::load has been called by com.foo.Server in module com.foo (file:\/path\/to\/com.foo.jar)\nWARNING: Use --enable-native-access=com.foo to avoid a warning for callers in this module\nWARNING: Restricted methods will be blocked in a future release unless native access is enabled\n<\/pre>\n<p>Le comportement par d\u00e9faut de la JVM en cas d&rsquo;utilisation d&rsquo;une librairie native passera de <code>warn<\/code> \u00e0 <code>deny<\/code> dans une future release.<\/p>\n<p>Cette JEP fais partie d&rsquo;une ensemble de changement dans la JVM pour restreinte certaines fonctionnalit\u00e9s de la JVM par d\u00e9faut, en for\u00e7ant l&rsquo;utilisateur \u00e0 activer sp\u00e9cifiquement ces fonctionnalit\u00e9s, dans le but d&rsquo;avoir une JVM plus robuste. Vous pouvez en lire plus sur le sujet dans la JEP en draft <a href=\"https:\/\/openjdk.org\/jeps\/8305968\" title=\"Integrity by Default\" rel=\"noopener\" target=\"_blank\">Integrity by Default<\/a>.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/472\" title=\"JEP 472\" rel=\"noopener\" target=\"_blank\">JEP 472<\/a>.<\/p>\n<h2>JEP 475: Late Barrier Expansion for G1<\/h2>\n<p>La JEP 475 simplifie la mise en place des barri\u00e8res du Garbage Collector (GC) G1 en d\u00e9pla\u00e7ant leur expansion du d\u00e9but du pipeline de compilation du Just In Time (JIT) compiler de la JVM (C2) vers la fin.<\/p>\n<p>G1 utilise des barri\u00e8res pour enregistrer des informations sur les acc\u00e8s \u00e0 la m\u00e9moire de l&rsquo;application. Ces barri\u00e8res n\u00e9cessitent une interaction avec le JIT et en complexifient le code et la maintenance.<\/p>\n<p>Des tests pr\u00e9liminaire ont montr\u00e9 que la mise en place des barri\u00e8res G1 avait un <a href=\"https:\/\/robcasloz.github.io\/blog\/assets\/c2-speed-results.html\" rel=\"noopener\" target=\"_blank\">overhead de 10 \u00e0 20% sur le JIT<\/a>. L&rsquo;id\u00e9e est qu&rsquo;au lieu d&rsquo;injecter la barri\u00e8re au d\u00e9but de la phase de compilation (dans l&rsquo;IR &#8211; l&rsquo;intermediate representation du code \u00e0 compiler) et de laisser C2 compiler le code de la barri\u00e8re, il est plus int\u00e9ressant de l&rsquo;injecter \u00e0 la fin de la phase de compilation directement en assembleur.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/475\" title=\"JEP 475\" rel=\"noopener\" target=\"_blank\">JEP 475<\/a> ainsi que dans l&rsquo;article <a href=\"https:\/\/robcasloz.github.io\/blog\/2024\/02\/14\/when-should-a-compiler-expand-garbage-collection-barriers.html\" rel=\"noopener\" target=\"_blank\">When should a compiler expand garbage collection barriers?<\/a> de Roberto Casta\u00f1eda Lozano.<\/p>\n<h2>JEP 478: Key Derivation Function API (Preview)<\/h2>\n<p>Nouvelle API pour les fonctions de d\u00e9rivation de cl\u00e9s (Key Derivation Function &#8211; KDF), qui sont des algorithmes cryptographiques permettant de d\u00e9river des cl\u00e9s suppl\u00e9mentaires \u00e0 partir d&rsquo;une cl\u00e9 secr\u00e8te et d&rsquo;autres donn\u00e9es.<\/p>\n<p>KDF fait partie du standard de cryptographie <a href=\"https:\/\/docs.oasis-open.org\/pkcs11\/pkcs11-spec\/v3.1\/os\/pkcs11-spec-v3.1-os.html\" title=\"PKCS #11\">PKCS #11<\/a>.<\/p>\n<p>KDF est aussi une des briques n\u00e9cessaires pour l&rsquo;impl\u00e9mentation de l&rsquo;Hybrid Public Key Encryption (HPKE) qui est un algorithme de cryptographie post-quantique. La cryptographie post-quantique regroupe un ensemble d&rsquo;algorithme cryptographique qui sont r\u00e9sistants aux ordinateurs quantiques. Je reviendrai sur le sujet dans la section traitant des algorithmes de type <strong>Module-Lattice-Based<\/strong> via les JEP 496 et 497.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/478\" title=\"JEP 478\" rel=\"noopener\" target=\"_blank\">JEP 478<\/a>.<\/p>\n<h2>JEP 479: Remove the Windows 32-bit x86 Port<\/h2>\n<p>Le port de la JVM pour Windows 32-bit pour les architectures x86 a \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9 en Java 21, il sera supprim\u00e9 en Java 24.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/479\" title=\"JEP 479\" rel=\"noopener\" target=\"_blank\">JEP 479<\/a>.<\/p>\n<h2>JEP 483: Ahead-of-Time Class Loading &amp; Linking<\/h2>\n<p>Le but de cette nouvelle fonctionnalit\u00e9 est d&rsquo;am\u00e9liorer le temps de d\u00e9marrage de la JVM en rendant les classes d&rsquo;une application instantan\u00e9ment disponibles, dans un \u00e9tat charg\u00e9 et li\u00e9, lorsque la JVM d\u00e9marre.<\/p>\n<p>Pour cela, un premier lancement de l&rsquo;application est n\u00e9cessaire. Lors de ce lancement, les classes charg\u00e9es sont enregistr\u00e9es dans un cache pour \u00eatre disponibles imm\u00e9diatement lors de lancements successifs.<\/p>\n<p>Dans la JVM, les classes sont charg\u00e9es \u00e0 la demande via un ClassLoader. La JVM est dynamique, la liste des classes \u00e0 charger n&rsquo;est pas fixe au d\u00e9marrage, car des classes peuvent \u00eatre cr\u00e9\u00e9es dynamiquement (par exemple : via des proxies dynamiques), ou charg\u00e9es dynamiquement via r\u00e9flexion.<\/p>\n<p>Mais charger une classe \u00e0 un co\u00fbt :<\/p>\n<ul><li>La JVM doit scanner tous les JAR du classpath pour localiser la classe et charger le fichier .class en m\u00e9moire,<\/li>\n\n<li>Puis elle doit parser la classe et cr\u00e9er un objet Class qui la repr\u00e9sente, linker la classe, v\u00e9rifier le bytecode, r\u00e9soudre les r\u00e9f\u00e9rences&#8230;<\/li>\n\n<li>Et pour finir, elle doit ex\u00e9cuter les initializers statique et les blocks statique.\n<\/li><\/ul>\n<p>M\u00eame si ces \u00e9tapes sont optimis\u00e9es, une application qui utilise des centaines de JAR et qui initialise des milliers de classes peut prendre pas mal de temps au d\u00e9marrage d\u00fb \u00e0 ces phases, ce qui est encore plus probl\u00e9matique pour les frameworks de microservice comme Spring qui ont tendances \u00e0 scanner des milliers de beans au d\u00e9marrage. M\u00eame quand ces \u00e9tapes sont faites de mani\u00e8re paresseuse, \u00e0 la demande, elles impactent fortement les premi\u00e8res minutes de fonctionnement d&rsquo;une application menant \u00e0 une performance en pic tardive.<\/p>\n<p>Avec la JEP 483: Ahead-of-Time Class Loading &amp; Linking, il va \u00eatre possible de cr\u00e9er un cache des classes initialis\u00e9es et link\u00e9es, puis de l&rsquo;utiliser dans une ex\u00e9cution successive de l&rsquo;application pour en optimiser le d\u00e9marrage.<\/p>\n<p>Contrairement \u00e0 GraalVM qui propose le m\u00eame type de fonctionnalit\u00e9, mais dans un <em>monde cl\u00f4t<\/em>, toutes les fonctionnalit\u00e9s de la JVM sont pr\u00e9serv\u00e9es. Une classe qui n&rsquo;est pas pr\u00e9sente dans l&rsquo;archive sera charg\u00e9e dynamiquement par la JVM.<\/p>\n<p>L&rsquo;utilisation du mode AOT se fait en trois \u00e9tapes : enregistrement des classes \u00e0 inclure dans le cache, cr\u00e9ation du cache, puis utilisation du cache.<\/p>\n<p>Exemple avec une application de type <em>Hello World<\/em> dans une classe unique <code>Main<\/code> :<\/p>\n<ol><li><code>java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf Main<\/code> : lacement de l&rsquo;application en mode record pour enregistrer les classes \u00e0 charger dans un fichier de configuration <strong>app.aotconf<\/strong>.<\/li>\n\n<li><code>java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=main.aot<\/code> : utilisation du fichier de configuration <strong>app.aotconf<\/strong> pour cr\u00e9er une archive de cache <strong>main.aot<\/strong>.<\/li>\n\n<li><code>java -XX:AOTCache=main.aot Main<\/code> : lancement de l&rsquo;application avec le cache <strong>main.aot<\/strong>.<\/li>\n<\/ol>\n<p>Une application telle que Spring PetClinic charge et lie environ 21 000 classes au d\u00e9marrage et d\u00e9marre en 4,486 secondes (JDK 23). Avec un cache AOT, elle d\u00e9marre en 2,604 secondes &#8211; ce qui repr\u00e9sente une am\u00e9lioration de 42 %. Le cache AOT occupe 130 m\u00e9gaoctets.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/483\" title=\"JEP 483\" rel=\"noopener\" target=\"_blank\">JEP 483<\/a>.<\/p>\n<h2>JEP 486: Permanently Disable the Security Manager<\/h2>\n<p>Le Security Manager a \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9 en Java 17, il est maintenant supprim\u00e9 totalement du JDK !<\/p>\n<p>Le Security Manager \u00e9tait un composant compliqu\u00e9 \u00e0 maintenir avec une empreinte importante dans le code, et certainement un impact en termes de performance (au moins au d\u00e9marrage d&rsquo;une application jusqu&rsquo;\u00e0 ce que le JIT en optimise les appels) ; sa suppression a entra\u00een\u00e9 la suppression de plus de 14000 lignes de code !<\/p>\n<p>Il y a eu beaucoup de discussion autour de sa suppression, le Security Manager permettait une forme de s\u00e9curit\u00e9 via des checks r\u00e9alis\u00e9s lors de l&rsquo;appel de certaines m\u00e9thodes du JDK (ouverture de thread, acc\u00e8s fichiers&#8230;), il avait \u00e9t\u00e9 cr\u00e9\u00e9 au d\u00e9part pour s\u00e9curiser l&rsquo;appel de code non fiable (par exemple, du code externe ex\u00e9cut\u00e9 dynamiquement) entre autres pour les applets (qu&rsquo;elles reposent en paix). Hors les besoins modernes de s\u00e9curit\u00e9 sont plus complexes et doivent \u00eatre r\u00e9alis\u00e9s via un ensemble d&rsquo;outils dont la s\u00e9curit\u00e9 p\u00e9riph\u00e9rique et le sandboxing sont les principaux alli\u00e9s. Il est fortement d\u00e9conseill\u00e9 d&rsquo;ex\u00e9cuter du code non fiable, et si cela est n\u00e9cessaire d&rsquo;<strong>autres techniques doivent \u00eatre mises en oeuvres<\/strong>.<\/p>\n<p>Ce qui est dommage dans la suppression du Security Manager c&rsquo;est que m\u00eame imparfait, il rendait de nombreux services, entre autres pour les plateformes qui avaient un syst\u00e8me de plugin tel que Kafka Connect, Elasticsearch ou <a href=\"https:\/\/kestra.io\/\" rel=\"noopener\" target=\"_blank\">Kestra<\/a> &#8211; l\u2019orchestrateur de donn\u00e9e pour lequel je travaille. Un syst\u00e8me de plugin va par d\u00e9finition ex\u00e9cuter du code non fiable, et les <strong>autres techniques qui doivent \u00eatre mises en oeuvres<\/strong> ne sont pas fournies en remplacement du Security Manager. La JEP conseille d&rsquo;ex\u00e9cuter du code non-fiable dans une sandbox (Docker, GraalVM) ou d&rsquo;impl\u00e9menter des contr\u00f4les d&rsquo;acc\u00e8s via un agent Java !<\/p>\n<p>Pour moi, c&rsquo;est assez probl\u00e9matique de supprimer sans aucune solution le Security Manager, il permettait de s\u00e9curiser du code non fiable, ce qui est n\u00e9cessaire pour un syst\u00e8me de plugin. Une partie de ses fonctionnalit\u00e9s auraient pu \u00eatre pr\u00e9serv\u00e9es ou remplac\u00e9es par un syst\u00e8me plus simple. Bien s\u00fbr, je suis ici biais\u00e9 car je vais devoir r\u00e9-impl\u00e9menter les <a href=\"https:\/\/kestra.io\/docs\/enterprise\/worker-isolation#java-security\" rel=\"noopener\" target=\"_blank\">r\u00e8gles de s\u00e9curit\u00e9 de Kestra<\/a> autrement, car nous utilisions le Security Manager.<\/p>\n<p>Stuart Marks a \u00e9crit un article int\u00e9ressant sur la suppression du Security Manager : <a href=\"https:\/\/stuartmarks.wordpress.com\/2024\/12\/12\/detoxifying-the-jdk-source-code\" rel=\"noopener\" target=\"_blank\">Detoxifying the JDK Source Code<\/a>.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/486\" title=\"JEP 486\" rel=\"noopener\" target=\"_blank\">JEP 486<\/a>.<\/p>\n<h2>JEP 490: ZGC: Remove the Non-Generational Mode<\/h2>\n<p>ZGC est un Garbage Collector (GC) d\u00e9velopp\u00e9 par Oracle et inclus dans OpenJDK. Il r\u00e9duit les temps de pause du GC en effectuant le travail d&rsquo;\u00e9vacuation en m\u00eame temps que les threads applicatifs en cours d&rsquo;ex\u00e9cution.<\/p>\n<p>ZGC n&rsquo;\u00e9tait pas g\u00e9n\u00e9rationnel lors de sa cr\u00e9ation, mais a un mode g\u00e9n\u00e9rationnel depuis Java 21. Cette JEP va supprimer le mode non g\u00e9n\u00e9rationnel pour r\u00e9duire le co\u00fbt de maintenance de ZGC.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/490\" title=\"JEP 490\" rel=\"noopener\" target=\"_blank\">JEP 490<\/a>.<\/p>\n<h2>JEP 491: Synchronize Virtual Threads without Pinning<\/h2>\n<p>Les Virtual threads sont des threads l\u00e9gers, avec un co\u00fbt de cr\u00e9ation et de scheduling faible, qui permettent de faciliter l\u2019\u00e9criture d\u2019application concurrente. Un virtual thread, quand il s&rsquo;ex\u00e9cute, va \u00eatre mont\u00e9 sur un platform thread (thread OS).<\/p>\n<p>Jusqu&rsquo;ici, la synchronisation Java (via le mot cl\u00e9 <code>synchronized<\/code>) ne l\u00e2chait pas le platform thread, on disait alors que le platform thread \u00e9tait attach\u00e9 (<strong>pinned<\/strong> en anglais) au virtual thread, ce qui limitait grandement la scallabilit\u00e9 des virtual threads si beaucoup d&rsquo;op\u00e9rations de synchronisation \u00e9taient effectu\u00e9es. Et la synchronisation est utilis\u00e9e \u00e0 de nombreux endroits au sein du JDK (pour les I\/O par exemples), ainsi que dans de nombreuses librairies (clients JDBC par exemple).<\/p>\n<p>Avec la JEP 491, les virtual threads vont maintenant l\u00e2cher leur platform thread en cas de synchronisation. C&rsquo;est une \u00e9tape importante pour les virtual threads, car c&rsquo;\u00e9tait le principal souci de performance qu&rsquo;on pouvait rencontrer lors de leur utilisation.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/491\" title=\"JEP 491\" rel=\"noopener\" target=\"_blank\">JEP 491<\/a>.<\/p>\n<h2>JEP 493: Linking Run-Time Images without JMODs<\/h2>\n<p>JEP 493 r\u00e9duit la taille du JDK d&rsquo;environ 25 % en permettant \u00e0 l&rsquo;outil jlink de cr\u00e9er des images d&rsquo;ex\u00e9cution personnalis\u00e9es sans utiliser les fichiers JMOD du JDK. Cette fonction doit \u00eatre activ\u00e9e lorsque le JDK est construit, tous les fournisseurs de JDK pourraient ne pas l&rsquo;activer, mais il est probable qu&rsquo;ils le fassent et que le JDK 24 soient 25% plus petit que les pr\u00e9c\u00e9dentes versions !<\/p>\n<p>Les fichiers JMOD sont les fichiers des modules du JDK utilis\u00e9s par jlink pour cr\u00e9er une image du JDK; or cette image contient elle-m\u00eame les fichiers des modules du JDK qui sont donc dupliqu\u00e9s, les fichiers JMOD ne servant \u00e0 rien.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/493\" title=\"JEP 493\" rel=\"noopener\" target=\"_blank\">JEP 493<\/a>.<\/p>\n<h2>JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism<\/h2>\n<p>La JEP 496 fournit une impl\u00e9mentation du m\u00e9canisme d&rsquo;encapsulation de cl\u00e9s bas\u00e9 sur un module-r\u00e9seau (Module-Lattice en anglais) r\u00e9sistant aux algorithmes quantiques (ML-KEM). Les m\u00e9canismes d&rsquo;encapsulation de cl\u00e9s (KEM) sont utilis\u00e9s pour s\u00e9curiser les cl\u00e9s sym\u00e9triques sur des canaux de communication non s\u00e9curis\u00e9s \u00e0 l&rsquo;aide de la cryptographie \u00e0 cl\u00e9 publique. Le ML-KEM a \u00e9t\u00e9 normalis\u00e9 par le National Institute of Standards and Technology (NIST) des \u00c9tats-Unis dans le cadre de la norme <a href=\"https:\/\/csrc.nist.gov\/pubs\/fips\/203\/final\" rel=\"noopener\" target=\"_blank\">FIPS 203<\/a>.<\/p>\n<p>Les algorithmes de type module-r\u00e9seau sont une classe d&rsquo;algorithme dit post-quantique, ils sont con\u00e7us pour \u00eatre s\u00e9curis\u00e9 contre les futures attaques de l&rsquo;informatique quantique.<\/p>\n<p>Les algorithmes cryptographiques actuels font appel \u00e0 des probl\u00e8mes de math\u00e9matiques finies (comme la factorisation des grands nombres) qui sont co\u00fbteux en termes de calcul. Casser via brute force ce type d&rsquo;algorithme pour des cl\u00e9s de grande taille prendrait des milliers d&rsquo;ann\u00e9es, m\u00eame pour un supercalculateur.<\/p>\n<p>Les ordinateurs quantiques sont th\u00e9oriquement capables de factoriser de grand nombre de mani\u00e8re beaucoup plus rapide gr\u00e2ce \u00e0 l&rsquo;algorithme de Shor, pour s\u00e9curiser les communications dans un monde o\u00f9 un ordinateur quantique existerait avec un nombre de Qubit suffisant pour factoriser un grand nombre (il faudrait un nombre de Qubit deux fois sup\u00e9rieur \u00e0 la taille de la cl\u00e9), il faut une nouvelle classe d&rsquo;algorithmes qui se basent sur une preuve math\u00e9matique diff\u00e9rente, c&rsquo;est l\u00e0 qu&rsquo;entre en jeux les algorithmes de type module-r\u00e9seau.<\/p>\n<p>Le NIST conseille de mettre en place ces algorithmes d&rsquo;ici 10 ans, mais il faut savoir que pour l&rsquo;instant les ordinateurs quantiques sont loin d&rsquo;avoir le nombre de Qubit n\u00e9cessaire. \u00c0 ce jour, ils ont g\u00e9n\u00e9ralement au plus 64 Qubit alors qu&rsquo;il en faudrait 1024 pour casser une encryption 512 bits et 4096 pour une encryption 2048 bits. Sans parler des probl\u00e8mes d&rsquo;exactitude&#8230;<\/p>\n<p>Plus d&rsquo;information sur la cryptographie post quantique dans cet article de Ben Evans : <a href=\"https:\/\/www.infoq.com\/news\/2024\/12\/java-post-quantum\" rel=\"noopener\" target=\"_blank\">Post-Quantum Cryptography in Java<\/a>.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/496\" title=\"JEP 496\" rel=\"noopener\" target=\"_blank\">JEP 496<\/a>.<\/p>\n<h2>JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm<\/h2>\n<p>La JEP 497 fournit une impl\u00e9mentation d&rsquo;algorithme de signature num\u00e9rique bas\u00e9 sur le module-r\u00e9seau (Module-Lattice en anglais) r\u00e9sistant aux algorithmes quantiques (ML-DSA). Les signatures num\u00e9riques sont utilis\u00e9es pour d\u00e9tecter les modifications non autoris\u00e9es des donn\u00e9es et pour authentifier l&rsquo;identit\u00e9 des signataires. Il a \u00e9t\u00e9 normalis\u00e9 par le National Institute of Standards and Technology (NIST) des \u00c9tats-Unis dans la norme FIPS 204.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/497\" title=\"JEP 497\" rel=\"noopener\" target=\"_blank\">JEP 497<\/a>.<\/p>\n<h2>JEP 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe<\/h2>\n<p><strong>Unsafe<\/strong> est, comme son nom l\u2019indique, une classe interne et non support\u00e9e du JDK qu\u2019il n\u2019est pas sans danger d\u2019appeler. Pour des raisons historiques, de nombreux frameworks bas-niveau utilisaient Unsafe pour des acc\u00e8s m\u00e9moire plus rapide. Gr\u00e2ce aux fonctionnalit\u00e9s VarHandle API (<a href=\"https:\/\/openjdk.org\/jeps\/193\" rel=\"noopener\" target=\"_blank\">JEP 193<\/a>, depuis Java 9) et Foreign Function &amp; Memory API (<a href=\"https:\/\/openjdk.org\/jeps\/454\" rel=\"noopener\" target=\"_blank\">JEP 454<\/a>, depuis Java 22), il y a maintenant des remplacements pour les m\u00e9thodes d\u2019Unsafe acc\u00e9dant \u00e0 la m\u00e9moire qui sont aussi performants, mais plus s\u00fbr et support\u00e9.<\/p>\n<p>Toutes ces m\u00e9thodes ont \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9es pour suppression dans Java 23, elles sont \u00e0 pr\u00e9sent modifi\u00e9es pour g\u00e9n\u00e9rer un <strong>WARNING<\/strong> dans les logs de la JVM lors de leur premi\u00e8re utilisation.<\/p>\n<p>Ce changement \u00e9tait pr\u00e9vu et annonc\u00e9 lors de leur d\u00e9pr\u00e9ciation en Java 23, il est pr\u00e9vu de les d\u00e9grader pour lever une exception en Java 26.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/498\" title=\"JEP 498\" rel=\"noopener\" target=\"_blank\">JEP 498<\/a>.<\/p>\n<h2>JEP 501: Deprecate the 32-bit x86 Port for Removal<\/h2>\n<p>Le port 32-bit pour Windows est supprim\u00e9 dans cette release, mais il reste un port 32-bit pour d&rsquo;autres OS (Linux). Cette JEP va d\u00e9pr\u00e9cier tous les ports 32-bit pour architecture x86 restant, donc celui pour Linux qui est le seul encore support\u00e9. Elle ne porte pas sur les autres ports 32-bit tel que celui pour ARM32 qui n&rsquo;est pas d\u00e9pr\u00e9ci\u00e9. L&rsquo;industrie a depuis longtemps abandonn\u00e9 l&rsquo;architecture 32-bit x86, Debian planifiant aussi d&rsquo;en arr\u00eater le support, il est logique d&rsquo;en planifier l&rsquo;arr\u00eat du support dans la JVM.<\/p>\n<p>Pour les architectures non support\u00e9es, il existe un port de la JVM sans sp\u00e9cificit\u00e9 d&rsquo;architecture : le port Zero, qui permettra toujours de faire tourner une JVM sous architecture 32-bit x86.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/501\" title=\"JEP 501\" rel=\"noopener\" target=\"_blank\">JEP 501<\/a>.<\/p>\n<h2>Les fonctionnalit\u00e9s qui sortent de preview<\/h2>\n<p>Les fonctionnalit\u00e9s suivantes sortent de preview (ou du module incubator) et passent en standard :<\/p>\n<ul><li><a href=\"https:\/\/openjdk.org\/jeps\/484\" rel=\"noopener\" target=\"_blank\">JEP 484<\/a> &#8211; <strong>Class-File API<\/strong> : API standard pour parser, g\u00e9n\u00e9rer et transformer les fichiers de classe Java.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/485\" rel=\"noopener\" target=\"_blank\">JEP 485<\/a> &#8211; <strong>Stream Gatherers<\/strong> : Enrichit l\u2019API Stream avec le support d\u2019op\u00e9rations interm\u00e9diaires personnalis\u00e9es.<\/li>\n<\/ul>\n<p>Pour les d\u00e9tails sur celles-ci, vous pouvez vous r\u00e9f\u00e9rer \u00e0 mes articles pr\u00e9c\u00e9dents.<\/p>\n<h2>Les fonctionnalit\u00e9s qui restent en preview<\/h2>\n<p>Les fonctionnalit\u00e9s suivantes restent en preview (ou en incubator module) :<\/p>\n<ul><li><a href=\"https:\/\/openjdk.org\/jeps\/487\" rel=\"noopener\" target=\"_blank\">JEP 487<\/a> &#8211; <strong>Vector API<\/strong> : neuvi\u00e8me incubation, API permettant d\u2019exprimer des calculs vectoriels qui se compilent au moment de l\u2019ex\u00e9cution en instructions vectorielles pour les architectures CPU prises en charge. Quelques changements dans l&rsquo;API et des am\u00e9liorations de performance. Une nouvelle classe Float16 a \u00e9t\u00e9 ajout\u00e9e qui supporte les variables 16-bit au format IEEE 754 binary16 en utilisant la Vector API. Il a \u00e9t\u00e9 act\u00e9 dans la JEP que la Vector API sera en incubation tant que les fonctionnalit\u00e9s du projet Valhalla ne seront pas disponibles en preview. Ce qui \u00e9tait attendu, car la Vector API pourra alors tirer parti des am\u00e9liorations de performance et de repr\u00e9sentation en m\u00e9moire que devrait apporter le projet Valhalla.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/495\">JEP 495<\/a> &#8211; <strong>Simple Source Files and Instance Main Methods<\/strong> : quatri\u00e8me preview, pr\u00e9c\u00e9demment nomm\u00e9e <em>Implicitly Declared Classes and Instance Main Methods<\/em>, simplifie l\u2019\u00e9criture de programmes simple en permettant de les d\u00e9finir dans une classe implicite (sans d\u00e9claration) et dans une m\u00e9thode d\u2019instance <code>void main()<\/code>. Aucun changement.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/499\" rel=\"noopener\" target=\"_blank\">JEP 499<\/a> &#8211; <strong>Structured Concurrency<\/strong> : quatri\u00e8me preview, nouvelle API permettant de simplifier l\u2019\u00e9criture de code multi-thread\u00e9 en permettant de traiter plusieurs t\u00e2ches concurrentes comme une unit\u00e9 de traitement unique. Aucun changement.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/487\" rel=\"noopener\" target=\"_blank\">JEP 487<\/a> &#8211; <strong>Scoped Values<\/strong> : quatri\u00e8me preview, permettent le partage de donn\u00e9es immuables au sein et entre les threads. Les m\u00e9thodes <code>ScopedValue.callWhere()<\/code> et <code>ScopedValue.runWhere<\/code> ont \u00e9t\u00e9 supprim\u00e9es, on ne peut dor\u00e9navant utiliser une <code>ScopedValue<\/code> que depuis <code>call(Callable)<\/code> ou <code>run(Runnable)<\/code>.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/492\" rel=\"noopener\" target=\"_blank\">JEP 492<\/a> &#8211; <strong>Flexible Constructor Bodies<\/strong> : troisi\u00e8me preview, fonctionnalit\u00e9 qui autorise des instructions <strong>avant<\/strong> l\u2019appel du constructeur parent tant que celles-ci n\u2019acc\u00e8dent pas \u00e0 l\u2019instance en cours de cr\u00e9ation. Aucun changement.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/494\" rel=\"noopener\" target=\"_blank\">JEP 494<\/a> &#8211; <strong>Module Import Declarations<\/strong> : seconde preview, permet l&rsquo;import de toutes les classes d&rsquo;un module, transitivement, via l&rsquo;instruction <code>import module java.base;<\/code>. Changements mineurs.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/488\" rel=\"noopener\" target=\"_blank\">JEP 488<\/a> &#8211; <strong>Primitive Types in Patterns, instanceof, and switch<\/strong> : seconde preview, ajoute le support des types primitifs dans les <code>instanceof<\/code> et les <code>switch<\/code>, et enrichit le pattern matching pour supporter des patterns de types primitifs : dans les <code>instanceof<\/code>, dans les cases des <code>switch<\/code>, et dans la d\u00e9construction d\u2019un record. Aucun changement.<\/li>\n<\/ul>\n<p>Pour les d\u00e9tails sur celles-ci, vous pouvez vous r\u00e9f\u00e9rer \u00e0 mes articles pr\u00e9c\u00e9dents.<\/p>\n<h2>Divers<\/h2>\n<p>Divers ajouts au JDK :<\/p>\n<ul><li><code>Console.println()<\/code> : \u00e9crit une ligne vide dans une console.<\/li>\n\n<li><code>Console.readLn()<\/code> : lit une ligne de texte depuis une console.<\/li>\n\n<li><code>IO.println()<\/code> : \u00e9crit une ligne vide dans la console syst\u00e8me.<\/li>\n\n<li><code>IO.readLn()<\/code> : lit une ligne de texte depuis la console syst\u00e8me.<\/li>\n\n<li><code>Reader.of(CharSequence)<\/code> : renvoie un lecteur qui lit les caract\u00e8res d&rsquo;une <code>CharSequence<\/code>. Le lecteur est initialement ouvert et la lecture commence au premier caract\u00e8re de la s\u00e9quence.<\/li>\n\n<li><code>Process.waitFor(Duration)<\/code> : fait attendre le thread actuel, si n\u00e9cessaire, jusqu&rsquo;\u00e0 ce que le processus repr\u00e9sent\u00e9 par cet objet <code>Process<\/code> se termine, ou que la dur\u00e9e d&rsquo;attente sp\u00e9cifi\u00e9e s&rsquo;\u00e9coule.<\/li>\n<\/ul>\n<p>La totalit\u00e9 des nouvelles API du JDK 24 peuvent \u00eatre trouv\u00e9es dans <a title=\"The Java Version Almanac \u2013 New APIs in Java 24\" href=\"https:\/\/javaalmanac.io\/jdk\/24\/apidiff\/23\/\" target=\"_blank\" rel=\"noopener\">The Java Version Almanac \u2013 New APIs in Java 24<\/a>.<\/p>\n<h2>Des changements internes, de la performance, et de la s\u00e9curit\u00e9<\/h2>\n<p>Comme toutes les nouvelles versions de Java, OpenJDK 24 contient son lot d&rsquo;optimisation de performance et d&rsquo;am\u00e9lioration de s\u00e9curit\u00e9.<\/p>\n<ul><li>La suite de cipher TLS_RSA a \u00e9t\u00e9 d\u00e9sactiv\u00e9e.<\/li>\n\n<li>Les performances pour SHA3 ont \u00e9t\u00e9 am\u00e9lior\u00e9es de 10 \u00e0 15% (<a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8333867\" rel=\"noopener\" target=\"_blank\">JDK-8333867<\/a>).<\/li>\n\n<li>Le support du mode PKCS#11 AES CTS (Ciphertext Stealing) a \u00e9t\u00e9 ajout\u00e9.<\/li>\n\n<li>La concat\u00e9nation de String a \u00e9t\u00e9 optimis\u00e9e en utilisant des classes cach\u00e9es g\u00e9n\u00e9r\u00e9es via Classfile API et utilisant l&rsquo;API MethodHandle (<a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8336856\" rel=\"noopener\" target=\"_blank\">JDK-8336856<\/a>) apportant pr\u00e8s de 40% d&rsquo;optimisation de performance. Voir cet excellent talk de Claes Redestad pendant Devoxx 2024 sur le sujet : <a href=\"https:\/\/www.youtube.com\/watch?v=tgX38gvMpjs\" rel=\"noopener\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=tgX38gvMpjs<\/a>.<\/li>\n\n<li><strong>secondary_super_cache<\/strong> est un cache utilis\u00e9 pour les <code>instanceof<\/code>, il met en cache un super type d&rsquo;une classe. Comme il ne contient qu&rsquo;une seule entr\u00e9e, si plusieurs threads font des <code>instanceof<\/code> sur des super type diff\u00e9rentes pour la m\u00eame classe, le cache va \u00eatre invalid\u00e9 sans arr\u00eat, ce qui peut avoir des cons\u00e9quences importantes en termes de performance. Ce cache a \u00e9t\u00e9 r\u00e9\u00e9crit par Andrew Haley de chez RedHat qui l&rsquo;a remplac\u00e9 par un cache via table de hachage (voir <a href=\"https:\/\/github.com\/openjdk\/jdk\/pull\/18309\" rel=\"noopener\" target=\"_blank\">#18309<\/a>. Ce probl\u00e8me \u00e9tait nomm\u00e9 <em>type pollution<\/em>; RedHat avait d\u00e9velopp\u00e9 un agent Java pour en d\u00e9tecter les cas probl\u00e9matiques (voir <a href=\"https:\/\/github.com\/RedHatPerf\/type-pollution-agent\" rel=\"noopener\" target=\"_blank\">type-pollution-agent<\/a>) et certains frameworks avait m\u00eame impl\u00e9ment\u00e9 des solutions de contournement pour l&rsquo;\u00e9viter dans les chemins critiques (par exemple pour Quarkus : <a href=\"https:\/\/github.com\/quarkusio\/quarkus\/pull\/28834\" rel=\"noopener\" target=\"_blank\">#28834<\/a>, <a href=\"https:\/\/github.com\/quarkusio\/quarkus\/pull\/28985\" rel=\"noopener\" target=\"_blank\">#28985<\/a> ou <a href=\"https:\/\/github.com\/quarkusio\/quarkus\/pull\/29109\" rel=\"noopener\" target=\"_blank\">#29109<\/a>).<\/li>\n\n<li><code>String.indexOf()<\/code> a vu une am\u00e9lioration de performance de 1.3x par l&rsquo;ajout d&rsquo;un intrinsic utilisant les instructions SIMD.<\/li>\n\n<li>Les op\u00e9rations de type bulk (fill, copy, mismatch) de <code>MemorySegment<\/code> ont vu leur performance am\u00e9lior\u00e9e pour des segments de petite taille. Ces op\u00e9rations \u00e9taient impl\u00e9ment\u00e9es en natif via <code>Unsafe<\/code>: pour des petits segments, le co\u00fbt de transition vers du code natif p\u00e9nalisait fortement les performances. Une impl\u00e9mentation en Java a \u00e9t\u00e9 fournie qui est utilis\u00e9e pour les segments de petite taille (par d\u00e9faut moins de 64KB) \u00e0 la place de l&rsquo;impl\u00e9mentation en code natif.<\/li>\n<\/ul>\n<p>Vous pouvez vous r\u00e9f\u00e9rer \u00e0 l\u2019article de Sean Mullan pour une liste exhaustive des changements de s\u00e9curit\u00e9 inclus dans cette version : <a href=\"https:\/\/seanjmullan.org\/blog\/2025\/04\/07\/jdk24\" title=\"JDK 24 Security Enhancements\" rel=\"noopener\" target=\"_blank\">JDK 24 Security Enhancements<\/a>.<\/p>\n<p>Vous pouvez vous r\u00e9f\u00e9rer \u00e0 l&rsquo;article de Claes Redestad et Per-Ake Minborg pour une liste exhaustive des am\u00e9liorations de performance inclus dans cette version : <a href=\"https:\/\/inside.java\/2025\/03\/19\/performance-improvements-in-jdk24\/\" title=\"Performance Improvements in JDK 24\" rel=\"noopener\" target=\"_blank\">Performance Improvements in JDK 24<\/a>.<\/p>\n<h2>JFR Events<\/h2>\n<p>Voici les nouveaux \u00e9v\u00e9nements Java Flight Recorder (JFR) de la JVM :<\/p>\n<ul><li><code>NativeMemoryUsageTotalPeak<\/code> : Total des pics d&rsquo;utilisation de la m\u00e9moire native pour la JVM (GraalVM Native Image uniquement). Il peut ne pas \u00eatre la somme exacte des \u00e9v\u00e9nements <code>NativeMemoryUsagePeak<\/code> en raison du timing.<\/li>\n\n<li><code>NativeMemoryUsagePeak<\/code> : Utilisation maximale de la m\u00e9moire native pour un type de m\u00e9moire donn\u00e9 dans la JVM (GraalVM Native Image uniquement).<\/li>\n\n<li><code>SerializationMisdeclaration<\/code> : M\u00e9thodes et champs mal d\u00e9clar\u00e9s pour la s\u00e9rialisation.<\/li>\n\n<li><code>SwapSpace<\/code> : m\u00e9moire swap de l&rsquo;OS.<\/li>\n<\/ul>\n<p>Vous pouvez retrouver tous les \u00e9v\u00e9nements JFR support\u00e9s dans cette version de Java sur la page <a title=\"JFR Events\" href=\"https:\/\/sap.github.io\/SapMachine\/jfrevents\/24.html\" target=\"_blank\" rel=\"noopener\">JFR Events<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Java 24 contient beaucoup de nouveaut\u00e9s, on eut se r\u00e9jouir de voir les Stream Gatherer sortirent de preview, mais il reste beaucoup de fonctionnalit\u00e9s qui semblent bloqu\u00e9es en preview sans aucun changement.<\/p>\n<p>Personnellement, je suis un peu d\u00e9\u00e7u de la suppression sans remplacement du Security Manager, m\u00eame si cela va me donner l&rsquo;opportunit\u00e9 de jouer avec les agents Java tr\u00e8s prochainement pour le remplacer ;).<\/p>\n<p>Pour retrouver tous les changements de Java 24, se r\u00e9f\u00e9rer aux <a href=\"https:\/\/jdk.java.net\/24\/release-notes\" rel=\"noopener\" target=\"_blank\">release notes<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 24 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res versions de Java, pour ceux qui voudraient les lire en voici les liens : Java 23, Java 22, Java 21, Java 20, Java 19, Java 18, Java 17, Java 16, Java 15, Java 14, Java 13,&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-24-quoi-de-neuf\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[11,224,163],"class_list":["post-1877","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java24","tag-whatsnew"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":856,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-next\/","url_meta":{"origin":1877,"position":0},"title":"Java.Next","author":"admin","date":"mercredi 31 octobre 2018","format":false,"excerpt":"Ma premi\u00e8re contribution au blog de Zenika est un article qui parle du futur (ou du pr\u00e9sent) de Java et des changements pour les d\u00e9veloppeurs dans les versions 9, 10 et 11. La gouvernance de Java y est aussi abord\u00e9. Cet article reprend et r\u00e9sume les articles que j'ai pr\u00e9c\u00e9demment\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":829,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-11-quoi-de-neuf\/","url_meta":{"origin":1877,"position":1},"title":"Java 11  : quoi de neuf ?","author":"admin","date":"lundi  1 octobre 2018","format":false,"excerpt":"Maintenant que Java 11 est sorti, c'est le moment de faire le tour des fonctionnalit\u00e9s qu'apporte cette version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res version de Java, pour ceux qui voudraient les lires en voici les liens : Java 10,\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":712,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/demarrage-jvm-8-vs-9\/","url_meta":{"origin":1877,"position":2},"title":"D\u00e9marrage JVM 8 vs 9","author":"admin","date":"jeudi 31 ao\u00fbt 2017","format":false,"excerpt":"Introduction En parcourant la mailing liste d'open JDK (core-lib-dev) j'ai vu plusieurs threads de mail \u00e0 propos d'optimisation de temps de d\u00e9marrage et d'occupation m\u00e9moire d'une JVM \"minimale\". Ce travail a \u00e9t\u00e9 r\u00e9alis\u00e9 en grande partie par Claes Redestad (Oracle) lors du d\u00e9veloppement de Java 9. J'ai donc d\u00e9cid\u00e9 de\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":722,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-10-quoi-de-neuf\/","url_meta":{"origin":1877,"position":3},"title":"Java 10 : quoi de neuf ?","author":"admin","date":"lundi 26 mars 2018","format":false,"excerpt":"Maintenant que Java 10 est sorti, il est temps de se pencher sur les nouveaut\u00e9s de cette version. Comme pour mon pr\u00e9c\u00e9dent article sur java 9, je vais me pencher principalement sur les changements qui impacterons les d\u00e9veloppeurs utilisant Java en laissant de c\u00f4t\u00e9 les changements internes\/anecdotique\/sur des API peu\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1839,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-vers-une-integrite-par-defaut-de-la-jvm\/","url_meta":{"origin":1877,"position":4},"title":"Java : vers une int\u00e9grit\u00e9 par d\u00e9faut de la JVM","author":"admin","date":"mardi  4 f\u00e9vrier 2025","format":false,"excerpt":"Cet article est paru pour la premi\u00e8re fois dans le magazine Programmez! Hors s\u00e9rie #16. La Machine Virtuelle Java (JVM) est un environnement d'ex\u00e9cution qui permet \u00e0 des programmes \u00e9crits en Java (ou dans d'autres langages compil\u00e9s en bytecode Java) de s'ex\u00e9cuter sur diff\u00e9rents syst\u00e8mes d'exploitation et architectures mat\u00e9rielles. D\u00e8s\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1112,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-15-quoi-de-neuf\/","url_meta":{"origin":1877,"position":5},"title":"Java 15 : quoi de neuf ?","author":"admin","date":"jeudi  2 juillet 2020","format":false,"excerpt":"Maintenant que Java 15 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res versions de Java, pour ceux qui\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1877","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1877"}],"version-history":[{"count":31,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1877\/revisions"}],"predecessor-version":[{"id":1941,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1877\/revisions\/1941"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}