{"id":1758,"date":"2024-01-08T12:55:24","date_gmt":"2024-01-08T11:55:24","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1758"},"modified":"2024-07-25T16:00:10","modified_gmt":"2024-07-25T14:00:10","slug":"java-22-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-22-quoi-de-neuf\/","title":{"rendered":"Java 22 : quoi de neuf ?"},"content":{"rendered":"<p>Maintenant que Java 22 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-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<h2>JEP 461 &#8211; Stream Gatherers (Preview)<\/h2>\n<p>Enrichit l&rsquo;API Stream avec le support d&rsquo;op\u00e9rations interm\u00e9diaires personnalis\u00e9es. C&rsquo;est une API en preview.<\/p>\n<p>L&rsquo;API Stream fournit un ensemble d&rsquo;op\u00e9ration interm\u00e9diaire et terminale fixe. Elle permet d&rsquo;\u00e9tendre les op\u00e9rations terminales via la m\u00e9thode <code>Stream::collect(Collector)<\/code>, mais ne permet pas d&rsquo;\u00e9tendre les op\u00e9rations interm\u00e9diaires. Certaines op\u00e9rations sont manquantes ou d&rsquo;autre sont possible via un ensemble d&rsquo;op\u00e9ration ou via une op\u00e9ration qui ne correspond pas totalement \u00e0 ce dont on a besoin.<\/p>\n<p>Au fil des ans, de nombreux ajouts d&rsquo;op\u00e9rations terminales ont \u00e9t\u00e9 propos\u00e9s, m\u00eame si la plupart ont du sens, il n&rsquo;est pas possible de tous les ajouter au SDK, ajouter la possibilit\u00e9 de d\u00e9finir ses propres op\u00e9rations interm\u00e9diaires pallie au probl\u00e8me.<\/p>\n<p>Avec la JEP 461, il est maintenant possible de d\u00e9finir ses propres op\u00e9rations interm\u00e9diaires via <code>Stream::gather(Gatherer)<\/code>.<\/p>\n<p>Un <em>gatherer<\/em> repr\u00e9sente la transformation d&rsquo;un \u00e9l\u00e9ment d&rsquo;une Stream en one-to-one, one-to-many, many-to-one ou many-to-many et peut arr\u00eater la transformation si n\u00e9cessaire, arr\u00eatant l&rsquo;\u00e9mission d&rsquo;\u00e9l\u00e9ment dans la stream.<\/p>\n<p>On peut combiner les gatherers entre eux : <code>stream.gather(...).gather(...).collect(...)<\/code>.<\/p>\n<p>L&rsquo;interface <code>java.util.stream.Gatherer<\/code> d\u00e9finit les m\u00e9thodes suivantes :<\/p>\n<ul><li><code>initializer()<\/code> : optionnel, permet de maintenir un \u00e9tat lors du traitement des \u00e9l\u00e9ments.<\/li>\n\n<li><code>integrator()<\/code> : int\u00e8gre un nouvel \u00e9l\u00e9ment depuis la stream entrante, et \u00e9met si n\u00e9cessaire un \u00e9l\u00e9ment dans la stream de sortie.<\/li>\n\n<li><code>combiner()<\/code> : optionnel, peut \u00eatre utilis\u00e9 pour \u00e9valuer le gatherer en parall\u00e8le pour les stream parall\u00e8le.<\/li>\n\n<li><code>finisher()<\/code> : optionnel, appel\u00e9 quand la stream n&rsquo;a plus d&rsquo;\u00e9l\u00e9ment en entr\u00e9e.<\/li>\n<\/ul>\n<p>L&rsquo;API Stream a \u00e9t\u00e9 enrichie avec les gatherer suivants :<\/p>\n<ul><li><code>fold<\/code> : stateful many-to-one gatherer qui construit un agr\u00e9gat de mani\u00e8re incr\u00e9mentielle et \u00e9met cet agr\u00e9gat lorsqu&rsquo;il n&rsquo;existe plus d&rsquo;\u00e9l\u00e9ments d&rsquo;entr\u00e9e.<\/li>\n\n<li><code>mapConcurrent<\/code> : stateful one-to-one gatherer qui invoque de mani\u00e8re concurrente une fonction fournie pour chaque \u00e9l\u00e9ment d&rsquo;entr\u00e9e, jusqu&rsquo;\u00e0 une limite fournie.<\/li>\n\n<li><code>scan<\/code> : stateful one-to-one gatherer qui applique une fonction fournie \u00e0 l&rsquo;\u00e9tat actuel et \u00e0 l&rsquo;\u00e9l\u00e9ment actuel pour produire un \u00e9l\u00e9ment en sortie.<\/li>\n\n<li><code>windowFixed<\/code> : stateful many-to-many gathere qui regroupe les \u00e9l\u00e9ments d&rsquo;entr\u00e9e dans des listes d&rsquo;une taille fournie, \u00e9mettant les fen\u00eatres en sortie lorsqu&rsquo;elles sont pleines.<\/li>\n\n<li><code>windowSliding<\/code> : stateful many-to-many gatherer qui regroupe les \u00e9l\u00e9ments d&rsquo;entr\u00e9e dans des listes d&rsquo;une taille fournie. Apr\u00e8s la premi\u00e8re fen\u00eatre, chaque fen\u00eatre suivante est cr\u00e9\u00e9e \u00e0 partir d&rsquo;une copie de son pr\u00e9d\u00e9cesseur en supprimant le premier \u00e9l\u00e9ment et en ajoutant l&rsquo;\u00e9l\u00e9ment suivant de la stream d&rsquo;entr\u00e9e.<\/li>\n<\/ul>\n<p>Voici un exemple d&rsquo;utilisation d&rsquo;un gatherer fournit dans le JDK :<\/p>\n<pre>\nvar numbers = List.of(1, 2, 3, 4, 5);\n\nvar slidingWindows = numbers.stream()\n    .gather(Gatherers.windowSliding(3))\n    .toList();\n\nSystem.out.println(slidingWindows);\n\/\/ [[1, 2, 3], [2, 3, 4], [3, 4, 5]]\n<\/pre>\n<p>La JavaDoc donne l&rsquo;exemple suivant de gatherer qui reproduit l&rsquo;op\u00e9ration <code>Stream.map()<\/code> :<\/p>\n<pre>\npublic  Gatherer map(Function mapper) {\n    return Gatherer.of(\n        (unused, element, downstream) -&gt; \/\/ integrator\n            downstream.push(mapper.apply(element))\n    );\n}\n<\/pre>\n<p>Plus d&rsquo;informations dans la <a title=\"JEP 461\" href=\"https:\/\/openjdk.org\/jeps\/461\" target=\"_blank\" rel=\"noopener\">JEP 461<\/a><\/p>\n<h2>JEP 458 &#8211; Launch Multi-File Source-Code Programs<\/h2>\n<p>Depuis Java 11, il est possible de lancer un programme depuis un fichier source <code>.java<\/code> sans \u00e9tape de compilation pr\u00e9alable. Le launcher Java va alors compiler le programme en m\u00e9moire automatiquement avant son ex\u00e9cution.<\/p>\n<p>Avec la JEP 458, il est maintenant possible de lancer un programme depuis un fichier source qui utilise une classe d\u00e9finie dans un autre fichier source, ce second fichier sera aussi compil\u00e9 automatiquement en m\u00e9moire. Les fichiers source sont recherch\u00e9s dans la hi\u00e9rarchie de r\u00e9pertoire habituelle en Java qui refl\u00e8te la structure des packages.<\/p>\n<p>Seuls les fichiers source utilis\u00e9s par le programme principal seront compil\u00e9s en m\u00e9moire.<\/p>\n<p>Plus d&rsquo;informations dans la <a title=\"JEP 458\" href=\"https:\/\/openjdk.org\/jeps\/458\" target=\"_blank\" rel=\"noopener\">JEP 458<\/a><\/p>\n<h2>JEP 447 &#8211; Statements before super (preview)<\/h2>\n<p>Quand une classe \u00e9tend une autre classe et veut appeler le constructeur de la classe parente dans son propre constructeur, la JVM oblige l&rsquo;appel du constructeur parent \u00e0 \u00eatre la premi\u00e8re instruction du constructeur de la classe parente. Ceci permet de s&rsquo;assurer que tous les champs de la classe parente sont initialis\u00e9s avant la construction de la classe enfant.<\/p>\n<p>La JEP 447 est une fonctionnalit\u00e9 en preview qui autorise des instructions <strong>avant<\/strong> l&rsquo;appel du constructeur parent tant que ceux-ci n&rsquo;acc\u00e8dent pas \u00e0 l&rsquo;instance en cours de cr\u00e9ation.<\/p>\n<p>Plusieurs exemples sont donn\u00e9s dans la JEP : validation des param\u00e8tres, pr\u00e9-calculs d&rsquo;arguments, &#8230;<\/p>\n<p>Voici par exemple une validation de param\u00e8tre avant la JEP 447:<\/p>\n<pre>public class PositiveBigInteger extends BigInteger {\n\n    public PositiveBigInteger(long value) {\n        super(value);               \/\/ Potentially unnecessary work\n        if (value &lt;= 0)\n            throw new IllegalArgumentException(&quot;non-positive value&quot;);\n    }\n\n}\n<\/pre>\n<p>Et avec la JEP 447 :<\/p>\n<pre>public class PositiveBigInteger extends BigInteger {\n\n    public PositiveBigInteger(long value) {\n        if (value &lt;= 0)\n            throw new IllegalArgumentException(&quot;non-positive value&quot;);\n        super(value);\n    }\n\n}\n<\/pre>\n<p>Le code est plus lisible et \u00e9vite potentiellement des effets du constructeur parent.<\/p>\n<p>Plus d&rsquo;informations dans la <a title=\"JEP 447\" href=\"https:\/\/openjdk.org\/jeps\/447\" target=\"_blank\" rel=\"noopener\">JEP 447<\/a><\/p>\n<h2>457 &#8211; Class-File API (Preview)<\/h2>\n<p>La JEP 457 fournit une API standard pour parser, g\u00e9n\u00e9rer et transformer les fichiers de classe Java. Cette API est en preview.<\/p>\n<p>L&rsquo;\u00e9cosyst\u00e8me Java a de nombreuses librairies qui permettent de parser et de g\u00e9n\u00e9rer des fichiers de classe Java: ASM, BCEL, Javassist, &#8230; La plupart des frameworks qui g\u00e9n\u00e8rent du bytecode les utilisent.<\/p>\n<p>Le format des classe Java \u00e9volue tous les 6 mois, \u00e0 chaque nouvelle release de Java, les framework de g\u00e9n\u00e9ration doivent donc \u00e9voluer en m\u00eame temps au risque de ne pas supporter les derni\u00e8res \u00e9volutions du langage.<\/p>\n<p>Le JDK lui-m\u00eame utilise ASM pour impl\u00e9menter certain de ses outils ainsi que pour l&rsquo;impl\u00e9mentation des lambda, ce qui cr\u00e9e une divergence entre les fonctionnalit\u00e9s d&rsquo;une version de Java et ce qui peut \u00eatre utilis\u00e9 au sein de la JVM dans les portions n\u00e9cessitant de la g\u00e9n\u00e9ration de fichier de classe, car il faut attendre une version d&rsquo;ASM supportant les nouvelles fonctionnalit\u00e9s de la version N pour les utiliser dans la version N+1.<\/p>\n<p>L&rsquo;API <strong>Class-File<\/strong> vient pallier ce probl\u00e8me en fournissant au sein du JDK une API pour parser, g\u00e9n\u00e9rer et transformer des fichiers de classe.<\/p>\n<p>La pr\u00e9sentation suivante faite par Brian Goetz au VM Language Summit 2023 pr\u00e9sente en d\u00e9tail l&rsquo;API, sa conception et son utilisation : <a href=\"https:\/\/www.youtube.com\/watch?v=pcg-E_qyMOI\" title=\"A Classfile API for the JDK\" rel=\"noopener\" target=\"_blank\">A Classfile API for the JDK<\/a>.<\/p>\n<p>Plus d&rsquo;informations dans la <a title=\"JEP 457\" href=\"https:\/\/openjdk.org\/jeps\/457\" target=\"_blank\" rel=\"noopener\">JEP 457<\/a><\/p>\n<h2>ListFormat<\/h2>\n<p><code>ListFormat<\/code> est un nouveau formateur qui permet de formater une liste de cha\u00eene de caract\u00e8re selon une locale selon le standard Unicode.<\/p>\n<p>Exemple :<\/p>\n<pre>var list = List.of(\"Black\", \"White\", \"Red\");\nvar formatter = ListFormat.getInstance();\nSystem.out.println(formatter.format(list));\n\/\/ [Black, White, Red]\n<\/pre>\n<p>Lors de la cr\u00e9ation du formateur on peut lui passer :<\/p>\n<ul><li>Une locale, sinon la locale par d\u00e9faut sera utilis\u00e9e.<\/li>\n\n<li>Le type de l&rsquo;\u00e9num\u00e9ration : STANDARD, OR ou UNIT. Par d\u00e9faut STANDARD.<\/li>\n\n<li>Le style de l&rsquo;\u00e9num\u00e9ration : FULL, SHORT ou NARROW. Par d\u00e9faut FULL.<\/li>\n<\/ul>\n<p>La table suivante montre les diff\u00e9rentes sorties pour la locale US :<\/p>\n<table><thead><tr><th><\/th>\n\n<th>FULL<\/th>\n\n<th>SHORT<\/th>\n\n<th>NARROW<\/th>\n    <\/tr><\/thead><tbody><tr><td>STANDARD<\/td>\n\n<td>Black, White, and Red<\/td>\n\n<td>Black, White, &amp; Red<\/td>\n\n<td>Black, White, Red<\/td>\n    <\/tr><tr><td>OR<\/td>\n\n<td>Black, White, or Red<\/td>\n\n<td>Black, White, or Red<\/td>\n\n<td>Black, White, or Red<\/td>\n    <\/tr><tr><td>UNIT<\/td>\n\n<td>Black, White, Red<\/td>\n\n<td>Black, White, Red<\/td>\n\n<td>Black White Red<\/td>\n    <\/tr><\/tbody><\/table>\n<p>Plus d&rsquo;information dans l&rsquo;issue <a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8041488\" title=\"JDK-8041488\" rel=\"noopener\" target=\"_blank\">JDK-8041488<\/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 title=\"JEP 454\" href=\"https:\/\/openjdk.org\/jeps\/454\" target=\"_blank\" rel=\"noopener\">JEP 454<\/a> &#8211; <strong>Foreign Function &amp; Memory API<\/strong> : API permettant l\u2019interconnexion de la JVM avec du code natif.<\/li>\n\n<li><a title=\"JEP 456\" href=\"https:\/\/openjdk.org\/jeps\/456\" target=\"_blank\" rel=\"noopener\">JEP 456<\/a> &#8211; <strong>Unnamed Variables &amp; Patterns<\/strong> : permet d&rsquo;utiliser <code>_<\/code> comme pattern ou variable anonyme (litt\u00e9ralement sans nom ou non-nomm\u00e9).<\/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<p>N\u00e9anmoins, un changement important a \u00e9t\u00e9 fait dans l&rsquo;API Foreign Function &amp; Memory qui doit \u00eatre not\u00e9 : l&rsquo;introduction de la notion de <strong>m\u00e9thode limit\u00e9e (restricted)<\/strong>. Certaines m\u00e9thodes de cette nouvelle API sont marqu\u00e9es comme limit\u00e9es : pour les utiliser, il faudra utiliser l&rsquo;option ligne de commande <code>--enable-native-access=module-name<\/code>. Pour l&rsquo;instant, l&rsquo;acc\u00e8s \u00e0 des m\u00e9thodes limit\u00e9es g\u00e9n\u00e8re un warning, mais il se pourrait que leur acc\u00e8s soit interdit dans une future version de la JVM. Les m\u00e9thodes limit\u00e9es sont utilis\u00e9es pour binder une fonction native et\/ou une donn\u00e9e native, ce qui est par nature unsafe. C&rsquo;est pour cela que son acc\u00e8s doit \u00eatre donn\u00e9 sp\u00e9cifiquement via une option ligne de commande.<\/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 title=\"JEP-460\" href=\"https:\/\/openjdk.org\/jeps\/460\" target=\"_blank\" rel=\"noopener\">JEP-460<\/a> &#8211; <strong>Vector API<\/strong> : septi\u00e8me incubation, API permettant d&rsquo;exprimer des calculs vectoriels qui se compilent au moment de l&rsquo;ex\u00e9cution en instructions vectorielles pour les architectures CPU prises en charge. Cette nouvelle version inclut des bugfixes et des am\u00e9liorations de performance.<\/li>\n\n<li><a title=\"JEP 464\" href=\"https:\/\/openjdk.org\/jeps\/464\" target=\"_blank\" rel=\"noopener\">JEP 464<\/a> &#8211; <strong>Scoped Values<\/strong> : seconde preview, permettent le partage de donn\u00e9es immuables au sein et entre les threads. Pas de changement notable pour cette nouvelle preview.<\/li>\n\n<li><a title=\"JEP 462\" href=\"https:\/\/openjdk.org\/jeps\/462\" target=\"_blank\" rel=\"noopener\">JEP 462<\/a> &#8211; <strong>Structured Concurrency<\/strong> : seconde 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. Pas de changement notable pour cette nouvelle preview.<\/li>\n\n<li><a title=\"JEP 463\" href=\"https:\/\/openjdk.org\/jeps\/463\" target=\"_blank\" rel=\"noopener\">JEP 463<\/a> &#8211; <strong>Implicitly Declared Classes and Instance Main Methods<\/strong> : seconde preview, simplifie l&rsquo;\u00e9criture de programmes simple en permettant de les d\u00e9finir dans une classe implicite (sans d\u00e9claration) et dans une m\u00e9thode d&rsquo;instance <code>void main()<\/code>.<\/li>\n\n<li><a title=\"JEP 459\" href=\"https:\/\/openjdk.org\/jeps\/459\" target=\"_blank\" rel=\"noopener\">JEP 459<\/a> &#8211; <strong>String Templates<\/strong> : seconde preview, un string template est un litt\u00e9ral de String qui vous permet d&rsquo;incorporer des expressions et des variables. Pas de changement notable pour cette nouvelle preview.<\/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.isTerminal()<\/code> : retourne true si l&rsquo;instance de la console est un terminal.<\/li>\n\n<li><code>Class.forPrimitiveName(String)<\/code> : retourne la classe associ\u00e9e au type primitif donn\u00e9.<\/li>\n\n<li><code>InetAddress.ofLiteral(String)<\/code> : cr\u00e9\u00e9 une <code>InetAddress<\/code> depuis la repr\u00e9sentation textuelle de l&rsquo;adresse IP. Cette m\u00e9thode statique existe aussi pour les classes <code>Inet4Address<\/code> et <code>Inet6Address<\/code>.<\/li>\n\n<li><code>RandomGenerator.equiDoubles(double left, double right, boolean isLeftIncluded, boolean isRightIncluded)<\/code>.<\/li>\n<\/ul>\n<p>La totalit\u00e9 des nouvelles API du JDK 22 peuvent \u00eatre trouv\u00e9es dans <a title=\"The Java Version Almanac \u2013 New APIs in Java 22\" href=\"https:\/\/javaalmanac.io\/jdk\/22\/apidiff\/21\/\" target=\"_blank\" rel=\"noopener\">The Java Version Almanac \u2013 New APIs in Java 22<\/a>.<\/p>\n<h2>Des changements internes, de la performance, et de la s\u00e9curit\u00e9<\/h2>\n<p>Le Garbage Collector G1 a vu une am\u00e9lioration lors d&rsquo;appel JNI (Java Native Interface) d\u00e9finissant une r\u00e9gion critique, pr\u00e9c\u00e9demment G1 \u00e9tait d\u00e9sactiv\u00e9 totalement, avec un risque de bloquer les threads de l&rsquo;application n\u00e9cessitant un GC, voir m\u00eame d&rsquo;out of memory.<\/p>\n<p>Gr\u00e2ce \u00e0 la JEP 423: Region Pinning for G1, G1GC est maintenant capable d&rsquo;\u00e9pingler (pinning) uniquement une r\u00e9gion en cas de section critique JNI, \u00e9vitant de bloquer les autres threads de l&rsquo;application n\u00e9cessitant un GC. Plus d&rsquo;informations dans la <a title=\"JEP 423\" href=\"https:\/\/openjdk.org\/jeps\/423\" target=\"_blank\" rel=\"noopener\">JEP 423<\/a>.<\/p>\n<p>Le Parallel GC et le Serial GC ont aussi vu des am\u00e9lioration au niveau du scan de la card table (la card table stocke les r\u00e9f\u00e9rence old-to-young). D\u2019autres changements ont \u00e9t\u00e9 faits c\u00f4t\u00e9 Garbage Collector, vous pouvez les retrouver dans cet article de Thomas Schatzl : <a href=\"https:\/\/tschatzl.github.io\/2024\/02\/06\/jdk22-g1-parallel-gc-changes.html\" rel=\"noopener\" target=\"_blank\">JDK 22 G1\/Parallel\/Serial GC changes<\/a>.<\/p>\n<p>Cot\u00e9 s\u00e9curit\u00e9, de nouveaux certificats racines ont \u00e9t\u00e9 ajout\u00e9s, et vous pouvez dor\u00e9navant utiliser <code>java -XshowSettings:security<\/code> pour voir les informations de configuration de la JVM li\u00e9 \u00e0 la s\u00e9curit\u00e9. Vous pouvez vous r\u00e9f\u00e9rer \u00e0 l\u2019article de Sean Mullan pour une liste exhaustive des changements de s\u00e9curit\u00e9 inclus cette version : <a href=\"https:\/\/seanjmullan.org\/blog\/2024\/03\/20\/jdk22\" title=\"JDK 22 Security Enhancements\" rel=\"noopener\" target=\"_blank\">JDK 22 Security Enhancements<\/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>CompilerQueueUtilization<\/code> : <em>pas de description.<\/em><\/li>\n\n<li><code>NativeLibraryLoad<\/code> : informations sur une biblioth\u00e8que dynamique ou une autre op\u00e9ration de chargement d&rsquo;image native.<\/li>\n\n<li><code>NativeLibraryUnload<\/code> : informations sur une biblioth\u00e8que dynamique ou une autre op\u00e9ration de d\u00e9chargement d&rsquo;image native.<\/li>\n\n<li><code>DeprecatedInvocation<\/code> : invocation unique d&rsquo;une m\u00e9thode annot\u00e9e avec <code>@Deprecated<\/code>.<\/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\/22.html\" target=\"_blank\" rel=\"noopener\">JFR Events<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>On aurait pu penser que Java 22 serait une version de stabilisation apr\u00e8s la version 21 qui est LTS mais non, il y a un ajout majeur que sont les Stream Gatherer et quelques JEP autour de la simplification du langage et sa facilit\u00e9 d&rsquo;utilisation. On peut noter aussi la sortie de preview de la Foreign Function &amp; Memory API qui va permettre une utilisation simplifi\u00e9e de fonctions natives en Java avec une API performante et plus facile d&rsquo;utilisation que JNI.<\/p>\n<p>Pour retrouver tous les changements de Java 22, se r\u00e9f\u00e9rer aux <a title=\"release notes\" href=\"https:\/\/jdk.java.net\/22\/release-notes\" target=\"_blank\" rel=\"noopener\">release notes<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 22 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 21, Java 20, Java 19, Java 18, Java 17, Java 16, Java 15, Java 14, Java 13, Java 12, Java 11,\u00a0Java&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-22-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,221,163],"class_list":["post-1758","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java22","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":1758,"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":1758,"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":1758,"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":1758,"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":1758,"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":1758,"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\/1758","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=1758"}],"version-history":[{"count":26,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1758\/revisions"}],"predecessor-version":[{"id":1836,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1758\/revisions\/1836"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}