{"id":979,"date":"2020-01-16T17:53:36","date_gmt":"2020-01-16T16:53:36","guid":{"rendered":"http:\/\/www.loicmathieu.fr\/wordpress\/?p=979"},"modified":"2020-05-06T09:49:22","modified_gmt":"2020-05-06T07:49:22","slug":"java-14-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-14-quoi-de-neuf\/","title":{"rendered":"Java 14 : quoi de neuf ?"},"content":{"rendered":"<p>Maintenant que Java 14 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 nouveaut\u00e9s des derni\u00e8res version de Java, pour ceux qui voudraient les lires en voici les liens : <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>\u00c0 l&rsquo;inverse des pr\u00e9c\u00e9dentes version de Java, la version 14 apporte beaucoup de fonctionnalit\u00e9s, de mon avis, c&rsquo;est une version qu&rsquo;on pourrait qualifier de majeur au m\u00eame titre que Java 5 ou 8 ! Records, Pattern Matching, Switch Expression, Text Block, &#8230; Plein de bonne choses dans cette version ;)<\/p>\n<h2>JEP 361: Switch Expressions (Standard)<\/h2>\n<p>Les Switch Expressions sortent de preview et deviennent une fonctionnalit\u00e9 standard !<\/p>\n<p>Le nouveau mot cl\u00e9 <strong>yield<\/strong> a donc \u00e9t\u00e9 valid\u00e9.<\/p>\n<p>Plus d&rsquo;information dans la JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/361\"><a href=\"https:\/\/openjdk.java.net\/jeps\/361\">https:\/\/openjdk.java.net\/jeps\/361<\/a><\/a><\/p>\n<p>Si vous aviez loup\u00e9 cette fonctionnalit\u00e9 dans les pr\u00e9c\u00e9dentes versions, voici un article qui la d\u00e9crit en d\u00e9tail : <a href=\"https:\/\/blog.codefx.org\/java\/switch-expressions\/\">Definitive Guide To Switch Expressions<\/a><\/p>\n<h2>JEP 368: Text Blocks (Second Preview)<\/h2>\n<p><strong>Text Blocks<\/strong> : la possibilit\u00e9 d&rsquo;\u00e9crire des <em>String Literals<\/em> sur plusieurs lignes est toujours en preview avec l&rsquo;ajout de deux nouvelles <em>escape sequence<\/em> : <code>'\\'<\/code> et <code>'\\s'<\/code>.<\/p>\n<p><code>'\\'<\/code> permet de mettre sur plusieurs lignes une String qui doit en \u00eatre sur une seule (comme en shell).<\/p>\n<pre>String text = \"\"\"\n                Lorem \\\n                ipsum \\\n                dolor \\\n                \"\"\";\nSystem.out.println(text); \/\/ Lorem impsum dolor\n<\/pre>\n<p><code>'\\s'<\/code> permet d&rsquo;ajouter un espace (\\u0020)<\/p>\n<pre>String colors = \"\"\"\n    red  \\s\n    green\\s\n    blue \\s\n    \"\"\";\n<\/pre>\n<p>Plus d&rsquo;information dans la JEP :<a href=\"https:\/\/openjdk.java.net\/jeps\/368\"> <a href=\"https:\/\/openjdk.java.net\/jeps\/368\">https:\/\/openjdk.java.net\/jeps\/368<\/a><\/a>\nSi vous aviez loup\u00e9 la fonctionnalit\u00e9 elle est d\u00e9crite dans mon article sur <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-13-quoi-de-neuf\/\">Java 13<\/a>.<\/p>\n<h2>JEP 358: Helpful NullPointerExceptions<\/h2>\n<p>Les <strong>NullPointerException<\/strong>\u00a0(NPE) sont monnaie courante en Java, et le message d&rsquo;erreur est bien souvent peu utile car pointe uniquement la ligne \u00e0 laquelle l&rsquo;exception arrive, et pas exactement quelle instruction \/ portion de code a g\u00e9n\u00e9r\u00e9 cette exception.<\/p>\n<p>SAP a impl\u00e9ment\u00e9 dans sa JVM (depuis 2006!) une version am\u00e9lior\u00e9e des messages des NPE. Fort de cette exp\u00e9rience, l&rsquo;impl\u00e9mentation en a \u00e9t\u00e9 revue dans OpenJDK, \u00e0 mon grand regret il faut ajouter une option au d\u00e9marrage de la JVM, <code>-XX:+ShowCodeDetailsInExceptionMessages<\/code>, pour activer cette fonctionnalit\u00e9 fort utile.<\/p>\n<p>Pour comparaison, voici les messages d&rsquo;erreurs standard pour des <strong>NullPointerException<\/strong>.\nOn peut remarquer qu&rsquo;on ne distingue pas quel objet est nulle : a ? a.s ?<\/p>\n<pre>$ jshell\n|  Welcome to JShell -- Version 14-ea\n|  For an introduction type: \/help intro\n\njshell&gt; public class A { public String s;}\n|  created class A\n\njshell&gt; A a;\na ==&gt; null\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException\n|        at (#3:1)\n\njshell&gt; a.s = \"toto\";\n|  Exception java.lang.NullPointerException\n|        at (#4:1)\n\njshell&gt; a = new A();\na ==&gt; A@3f8f9dd6\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException\n|        at (#6:1)\n\njshell&gt; \n<\/pre>\n<p>Ex\u00e9cuter les m\u00eame ligne de code mais en activant les messages d&rsquo;erreur utile pour les NPE va nous donner pr\u00e9cis\u00e9ment quel objet est nul et quelle op\u00e9ration a g\u00e9n\u00e9r\u00e9e un NPE sur cet objet (read, write, appel de m\u00e9thode).<\/p>\n<pre>$ jshell -R-XX:+ShowCodeDetailsInExceptionMessages\n|  Welcome to JShell -- Version 14-ea\n|  For an introduction type: \/help intro\n\njshell&gt; public class A { public String s;}\n|  created class A\n\njshell&gt; A a;\na ==&gt; null\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException: Cannot read field \"s\" because \"REPL.$JShell$12.a\" is null\n|        at (#3:1)\n\njshell&gt; a.s = \"toto\";\n|  Exception java.lang.NullPointerException: Cannot assign field \"s\" because \"REPL.$JShell$12.a\" is null\n|        at (#4:1)\n\njshell&gt; a = new A();\na ==&gt; A@3f8f9dd6\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException: Cannot invoke \"String.toString()\" because \"REPL.$JShell$12.a.s\" is null\n|        at (#6:1)\n\njshell&gt;\n<\/pre>\n<p>Plus d&rsquo;information dans la JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/358\"><a href=\"https:\/\/openjdk.java.net\/jeps\/358\">https:\/\/openjdk.java.net\/jeps\/358<\/a><\/a><\/p>\n<h2>JEP 359: Records (Preview)<\/h2>\n<p>En citant la JEP : <strong><em>Records provides a compact syntax for declaring classes which are transparent holders for shallowly immutable data<\/em><\/strong>.<\/p>\n<p>C&rsquo;est un nouveau type Java (comme class et enum), son but est d&rsquo;\u00eatre un conteneur de donn\u00e9s. Les Records sont implicitement final et ne peuvent \u00eatre abstrait.<\/p>\n<p>Les Records fournissent une impl\u00e9mentation par d\u00e9faut pour du code boilerplate que vous auriez sinon g\u00e9n\u00e9r\u00e9 via votre IDE.<\/p>\n<pre>\njshell&gt; record Point(int x, int y) { }\n\njshell&gt; Point p = new Point(); \/\/ all fields need to be initialized at construction time\n|  Error:\n|  constructor Point in record Point cannot be applied to given types;\n|    required: int,int\n|    found:    no arguments\n|    reason: actual and formal argument lists differ in length\n|  Point p = new Point();\n|            ^---------^\n\njshell&gt; Point p = new Point(1, 1);\np ==&gt; Point[x=1, y=1]\n<\/pre>\n<p>Tous les Records ont des accesseurs publique (mais les champs sont priv\u00e9) et une m\u00e9thode <code>toString<\/code>.<\/p>\n<pre>\njshell&gt; p.x \/\/field is private\n|  Error:\n|  x has private access in Point\n|  p.x\n|  ^-^\n\njshell&gt; p.x(); \/\/public accessor\n$8 ==&gt; 1\n\njshell&gt; p.toString(); \/\/default toString()\n$9 ==&gt; \"Point[x=1, y=1]\"\n<\/pre>\n<p>Tous les Records ont les m\u00e9thodes <code>equals<\/code> et <code>hashCode<\/code> dont les impl\u00e9mentations sont bas\u00e9 sur le type du Record et son \u00e9tat (ses champs donc).<\/p>\n<pre>jshell&gt; Point other = new Point(1,1);\nother ==&gt; Point[x=1, y=1]\n\njshell&gt; other.equals(p);\n$11 ==&gt; true\n\njshell&gt; other == p\n$12 ==&gt; false\n<\/pre>\n<p>Vous pouvez red\u00e9finir les m\u00e9thodes et constructeurs par d\u00e9faut d&rsquo;un Record.<\/p>\n<p>Quand vous red\u00e9finissez le constructeur par d\u00e9faut, il n&rsquo;y a pas besoin de r\u00e9p\u00e9ter l\u2019initialisation des champs et vous pouvez directement acc\u00e9der aux champs du Record.<\/p>\n<pre>record Range(int lo, int hi) {\n  public Range {\n    if (lo &gt; hi)  \/* referring here to the implicit constructor parameters *\/\n      throw new IllegalArgumentException(String.format(\"(%d,%d)\", lo, hi));\n  }\n}\n<\/pre>\n<p>Plus d&rsquo;information dans la JEP :<a href=\"https:\/\/openjdk.java.net\/jeps\/359\"> <a href=\"https:\/\/openjdk.java.net\/jeps\/359\">https:\/\/openjdk.java.net\/jeps\/359<\/a><\/a><\/p>\n<h2>JEP 305: Pattern Matching for instanceof (Preview)<\/h2>\n<p>Chaque d\u00e9veloppeur a d\u00e9j\u00e0 \u00e9crit du code qui ressemble \u00e0 \u00e7a avec l&rsquo;op\u00e9rateur <strong>instanceof<\/strong>:<\/p>\n<pre>if (obj instanceof Integer) {\n    int intValue = ((Integer) obj).intValue();\n    \/\/ use intValue\n}\n<\/pre>\n<p>Le cast apr\u00e8s l&rsquo;<strong>instanceof<\/strong> semble superflu car on vient de tester le type de l&rsquo;objet.\nEt c&rsquo;est l\u00e0 qu&rsquo;entre en sc\u00e8ne le <em>pattern matching<\/em>, il va permettre de v\u00e9rifier qu&rsquo;un objet est d&rsquo;un type pr\u00e9cis (comme <strong>instanceof<\/strong> le fait) et \u00ab\u00a0<em>extraire<\/em>\u00a0\u00bb la \u00ab\u00a0<em>forme<\/em>\u00a0\u00bb de l&rsquo;objet dans une nouvelle variable. On va donc pouvoir remplacer le code pr\u00e9c\u00e9dent par celui-ci<\/p>\n<pre>if (obj instanceof Integer intValue) {\n    \/\/ use intValue\n}\n<\/pre>\n<p>Plus besoin de <em>cast<\/em>, et on assigne \u00e0 une variable locale au bloc qui va permettre d&rsquo;utiliser directement l&rsquo;objet via son type v\u00e9rifi\u00e9 par l&rsquo;op\u00e9rateur <strong>instanceof<\/strong>.\nPour utiliser le <em>pattern matching<\/em>, il faut ajouter l&rsquo;option <code>--enable-preview<\/code> a votre ligne de commande car c&rsquo;est pour l&rsquo;instant une fonctionnalit\u00e9 en preview.<\/p>\n<p>Voici un exemple un peu plus complet via JSHell.<\/p>\n<pre>$ jshell --enable-preview\n|  Welcome to JShell -- Version 14-ea\n|  For an introduction type: \/help intro\n\njshell&gt; public void print(Object o) {\n   ...&gt; if(o instanceof String s) System.out.println(\"String =&gt;\" + s);\n   ...&gt; if(o instanceof Integer i) System.out.println(\"Integer =&gt;\" + i);\n   ...&gt; }\n|  created method print(Object)\n\njshell&gt; print(1)\nInteger =&gt;1\n\njshell&gt; print(\"toto\")\nString =&gt;toto\n\n<\/pre>\n<p>Plus d&rsquo;information dans la JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/305\"><a href=\"https:\/\/openjdk.java.net\/jeps\/305\">https:\/\/openjdk.java.net\/jeps\/305<\/a><\/a><\/p>\n<p>Brian Goetz a \u00e9crit un article plus vaste sur le <em>Pattern Matching<\/em> qui pr\u00e9lude de ce qui pourrais arriver dans les prochaines versions de Java sur le sujet : <a href=\"https:\/\/cr.openjdk.java.net\/~briangoetz\/amber\/pattern-match.html\"><a href=\"https:\/\/cr.openjdk.java.net\/~briangoetz\/amber\/pattern-match.html\">https:\/\/cr.openjdk.java.net\/~briangoetz\/amber\/pattern-match.html<\/a><\/a><\/p>\n<h2>Divers<\/h2>\n<ul><li>JDK-8229485 : Ajout de StrictMath::decrementExact, StrictMath::incrementExact et StrictMath::negateExact()<\/li>\n\n<li>JDK-8232633 : Support de la pluralisation dans\u00a0CompactNumberFormat<\/li>\n\n<li>JDK-8202385 : Ajout de l&rsquo;annotation <code>@Serial<\/code> qui permet de marquer des champs\/m\u00e9thodes comme relatif \u00e0 la s\u00e9rialisation. Comme le protocole de s\u00e9rialisation est bas\u00e9 sur des champs et m\u00e9thodes <em>standard<\/em> et pas un m\u00e9canisme ancr\u00e9 dans le JDK, le compilateur ne pouvait pas valider la signature de ces champs et m\u00e9thodes. Maintenant en annotant un champ (serialVersionUID par exemple) ou une m\u00e9thode (writeObject par exemple) avec <code>@Serial<\/code> le compilateur pourra v\u00e9rifier la bonne signature des champs et m\u00e9thodes relatifs \u00e0 la s\u00e9rialisation et \u00e9viter les possibles erreurs de d\u00e9veloppement.<\/li>\n<\/ul>\n<h2>JEP 343: Packaging Tool (Incubator)<\/h2>\n<p><strong>jpackage<\/strong> est un outil permettant de packager votre application dans un format natif \u00e0 votre OS (attention, c&rsquo;est le format de packaging qui est natif par votre application, cela n&rsquo;a rien \u00e0 voire avec GraalVM native image).<\/p>\n<p>Mon OS \u00e9tant Ubuntu, <strong>jpackage<\/strong> va me permettre de packager mon application au format <strong>.deb<\/strong>. Je vais prendre comme exemple l&rsquo;application <a href=\"https:\/\/quarkus.io\/guides\/getting-started\" target=\"_blank\" rel=\"noopener noreferrer\">getting-started <\/a>de Quarkus.<\/p>\n<p>Tout d&rsquo;abord, il faut utiliser <strong>jpackage<\/strong> pour g\u00e9n\u00e9rer un package. Il faut lui passer le r\u00e9pertoire de votre application (&#8211;input) et son main (ici &#8211;main-jar pour pr\u00e9ciser le jar contenant le main).<\/p>\n<pre>$ jpackage --name getting-started --input target --main-jar getting-started-1.0-SNAPSHOT-runner.jar\nWARNING: Using incubator modules: jdk.incubator.jpackage\n<\/pre>\n<p>Ensuite, je peux utiliser <strong>dpkg<\/strong> pour installer ce package sur mon OS.<\/p>\n<pre>$ sudo dpkg -i getting-started_1.0-1_amd64.deb \nS\u00e9lection du paquet getting-started pr\u00e9c\u00e9demment d\u00e9s\u00e9lectionn\u00e9.\n(Lecture de la base de donn\u00e9es... 256348 fichiers et r\u00e9pertoires d\u00e9j\u00e0 install\u00e9s.)\nPr\u00e9paration du d\u00e9paquetage de getting-started_1.0-1_amd64.deb ...\nD\u00e9paquetage de getting-started (1.0-1) ...\nParam\u00e9trage de getting-started (1.0-1) ...\n<\/pre>\n<p>L&rsquo;application sera install\u00e9e dans \/opt\/getting-started, pour la lancer il y a un ex\u00e9cutable dans le r\u00e9pertoire bin.<\/p>\n<pre>$ \/opt\/getting-started\/bin\/getting-started \n2019-12-31 17:17:25,933 INFO  [io.quarkus] (main) getting-started 1.0-SNAPSHOT (running on Quarkus 1.0.1.Final) started in 1.130s. Listening on: http:\/\/0.0.0.0:8080\n2019-12-31 17:17:25,937 INFO  [io.quarkus] (main) Profile prod activated. \n2019-12-31 17:17:25,937 INFO  [io.quarkus] (main) Installed features: [agroal, cdi, resteasy]\n<\/pre>\n<p>Les fichiers de notre application se retrouvent dans \/opt\/getting-started\/lib\/app\/, d&rsquo;autre r\u00e9pertoires contiennent les fichiers propres \u00e0 <strong>jpackage<\/strong>.<\/p>\n<p>Pour finir, nous pouvons d\u00e9sinstaller le package via la commande <strong>dpkg<\/strong><\/p>\n<pre>$ sudo dpkg -r getting-started\n(Lecture de la base de donn\u00e9es... 256753 fichiers et r\u00e9pertoires d\u00e9j\u00e0 install\u00e9s.)\nSuppression de getting-started (1.0-1) ...\n<\/pre>\n<p>Plus d&rsquo;information dans la JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/343\"><a href=\"https:\/\/openjdk.java.net\/jeps\/343\">https:\/\/openjdk.java.net\/jeps\/343<\/a><\/a><\/p>\n<h2>JEP 352: Non-Volatile Mapped Byte Buffers<\/h2>\n<p>L&rsquo;API <code>MappedByteBuffer<\/code> a \u00e9t\u00e9 mise \u00e0 jour pour permettre le support des <em>Non-Volatile Memory<\/em> (NVM).<\/p>\n<p>Plus d&rsquo;information dans la JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/352\"><a href=\"https:\/\/openjdk.java.net\/jeps\/352\">https:\/\/openjdk.java.net\/jeps\/352<\/a><\/a><\/p>\n<h2>JEP 370: Foreign-Memory Access API (Incubator)<\/h2>\n<p>Un nouveau module incubator a \u00e9t\u00e9 cr\u00e9\u00e9 pour d\u00e9finir une nouvelle API d&rsquo;acc\u00e8s \u00e0 la m\u00e9moire hors-heap.<\/p>\n<p>Cette fonctionnalit\u00e9 est plut\u00f4t \u00e0 destination des d\u00e9veloppeurs de framework comme il est rare de devoir acc\u00e9der \u00e0 de la m\u00e9moire native depuis une application Java. Jusqu&rsquo;alors ils utilisaient principalement <code>ByteBuffer<\/code> et <code>Unsafe<\/code>. Comme l&rsquo;utilisation d&rsquo;<code>Unsafe<\/code> est fortement d\u00e9conseill\u00e9 et que <code>ByteBuffer<\/code>\u00a0a de nombreux d\u00e9savantage, cette nouvelle API se veut plus pratique \u00e0 utiliser et aussi performante qu&rsquo;<code>Unsafe<\/code> (voir plus car designer pour tirer parti des optimisations du JIT).<\/p>\n<p>Voici un exemple d&rsquo;usage simple (l&rsquo;API est faite pour couvrir des cas beaucoup plus complexe avec la notion de memory layout et de stride pour les multi-dimension).<\/p>\n<pre>VarHandle intHandle = MemoryHandles.varHandle(int.class);\n\ntry (MemorySegment segment = MemorySegment.allocateNative(100)) {\n   MemoryAddress base = segment.baseAddress();\n   for (int i = 0 ; i &amp;lt; 25 ; i++) {\n        intHandle.set(base.offset(i * 4), i);\n   }\n}\n<\/pre>\n<p>Plus d&rsquo;information dans le JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/370\"><a href=\"https:\/\/openjdk.java.net\/jeps\/370\">https:\/\/openjdk.java.net\/jeps\/370<\/a><\/a><\/p>\n<h2>Garbage Collector<\/h2>\n<p>Beaucoup de nouveaut\u00e9s du c\u00f4t\u00e9 des GC, des nouvelles fonctionnalit\u00e9, de la performance, de la d\u00e9pr\u00e9cation et de la suppression !<\/p>\n<h3>JEP 345: NUMA-Aware Memory Allocation for G1<\/h3>\n<p>G1 a \u00e9t\u00e9 modifi\u00e9 pour \u00eatre \u00ab\u00a0NUMA-Aware\u00a0\u00bb. NUMA &#8211; <em>Non Uniform Memory Access<\/em> &#8211; est une des caract\u00e9ristiques des architectures CPU modernes ; pour faire tr\u00e8s simples, le co\u00fbt d&rsquo;acc\u00e8s cache \/ m\u00e9moire peut \u00eatre diff\u00e9rent d&rsquo;un c\u0153ur \u00e0 l&rsquo;autre de CPU vers une ligne de cache \/\u00a0une barrette de m\u00e9moire.<\/p>\n<p>L&rsquo;algorithme de G1 a \u00e9t\u00e9 modifi\u00e9 pour en tenir compte (pr\u00e9f\u00e9rer une allocation plus proche du CPU). Le ParalleCG est NUMA-aware depuis longtemps, G1 comble donc juste son retard sur le sujet.<\/p>\n<p>Cette fonctionnalit\u00e9 cible principalement les machines ayant plusieurs sockets ou un grand nombre de c\u0153urs, certains benchmarks agressifs c\u00f4t\u00e9 GC montrent une optimisation des performances de l&rsquo;ordre de 5% avec l&rsquo;option <code>+UseNUMA<\/code>.<\/p>\n<p>Plus d&rsquo;information dans le JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/345\"><a href=\"https:\/\/openjdk.java.net\/jeps\/345\">https:\/\/openjdk.java.net\/jeps\/345<\/a><\/a><\/p>\n<h3>JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector<\/h3>\n<p>Apr\u00e8s avoir \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9 avec Java 9, CMS est finalement supprim\u00e9 avec Java 14, personne dans la communaut\u00e9 n&rsquo;ayant voulu le maintenir.<\/p>\n<p>CMS \u00e9tait un algorithme de GC concurrent tr\u00e8s performant, ciblant les heap de taille moyenne et hautement configurable. Il souffrait du manque de phase de compaction et Oracle voulant investir de plus en plus dans G1 et ZGC ne d\u00e9sirait plus maintenir un algorithme concurrent de plus.<\/p>\n<p>Jusqu&rsquo;il y a peu, c&rsquo;\u00e9tait un des algorithmes les plus performants pour les heap de moyennes tailles, et bien souvent on n&rsquo;arrivait pas \u00e0 configurer G1 pour avoir des performances aussi hautes. Esp\u00e9rons qu&rsquo;avec les nouvelles optimisations r\u00e9alis\u00e9 dans G1 dans les derni\u00e8res version de Java il arrive d\u00e9sormais \u00e0 tenir la t\u00eate \u00e0 CMS &#8230; ou alors il y a toujours ZGC et Shenandoah &#8230;.<\/p>\n<p>Plus d&rsquo;information dans le JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/363\"><a href=\"https:\/\/openjdk.java.net\/jeps\/363\">https:\/\/openjdk.java.net\/jeps\/363<\/a><\/a><\/p>\n<h3>JEP 365: ZGC on Windows et JEP 364: ZGC on macOS<\/h3>\n<p>Le Garbage Collector ZGC a \u00e9t\u00e9 port\u00e9 sur Windows (version 1803 de Windows 10 minimum) et macOS.<\/p>\n<p>Plus d&rsquo;information dans les JEP <a href=\"https:\/\/openjdk.java.net\/jeps\/364\"><a href=\"https:\/\/openjdk.java.net\/jeps\/364\">https:\/\/openjdk.java.net\/jeps\/364<\/a><\/a> et <a href=\"https:\/\/openjdk.java.net\/jeps\/365\"><a href=\"https:\/\/openjdk.java.net\/jeps\/365\">https:\/\/openjdk.java.net\/jeps\/365<\/a><\/a><\/p>\n<h3 id=\"summary-val\">Parallel GC<\/h3>\n<p><strong>JDK-8204951 &#8211; Investigate to use WorkGang for Parallel GC<\/strong> : changement dans la gestion des threads du ParallelGC, il utilise d\u00e9sormais le m\u00eame WorkGang que les autres GC. Moins de co\u00fbt de maintenance donc et surtout des performances GC optimis\u00e9s\u00a0entre 0% et 40% d\u00e9pendant du benchmark (moyenne de 10%).<\/p>\n<p>Plus d&rsquo;information dans le JBS : <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8204951\"><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8204951\">https:\/\/bugs.openjdk.java.net\/browse\/JDK-8204951<\/a><\/a><\/p>\n<p><strong>JDK-8220465 &#8211; Use shadow regions for faster ParallelGC full GCs<\/strong> : optimisation de l&rsquo;impl\u00e9mentation des full collection pour le ParallelGC. Les tests ont montr\u00e9 des performances x2 \u00e0 x3 en cas de full GC !<\/p>\n<p>Plus d&rsquo;information dans le JBS : <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8220465\"><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8220465\">https:\/\/bugs.openjdk.java.net\/browse\/JDK-8220465<\/a><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 14 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 version de Java, pour ceux qui voudraient les lires en voici les liens : Java 13, Java 12, Java 11,\u00a0Java 10,\u00a0et\u00a0Java 9. \u00c0 l&rsquo;inverse des pr\u00e9c\u00e9dentes version de Java, la version 14 apporte beaucoup de fonctionnalit\u00e9s,&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-14-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,176,163],"class_list":["post-979","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java14","tag-whatsnew"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1112,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-15-quoi-de-neuf\/","url_meta":{"origin":979,"position":0},"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":[]},{"id":722,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-10-quoi-de-neuf\/","url_meta":{"origin":979,"position":1},"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":1375,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-18-quoi-de-neuf\/","url_meta":{"origin":979,"position":2},"title":"Java 18 : quoi de neuf ?","author":"admin","date":"mardi  4 janvier 2022","format":false,"excerpt":"Maintenant que Java 18 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":[]},{"id":947,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-13-quoi-de-neuf\/","url_meta":{"origin":979,"position":3},"title":"Java 13 : quoi de neuf ?","author":"admin","date":"mardi 13 ao\u00fbt 2019","format":false,"excerpt":"Maintenant que Java 13 est features complete (Release Candidate 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 version de Java, pour ceux qui voudraient\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":1684,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-21-quoi-de-neuf\/","url_meta":{"origin":979,"position":4},"title":"Java 21 : quoi de neuf ?","author":"admin","date":"mardi  8 ao\u00fbt 2023","format":false,"excerpt":"Maintenant que Java 21 est features complete (Rampdown Phase Two 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":"Java Collection API hierarchy","src":"https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":865,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-12-quoi-de-neuf\/","url_meta":{"origin":979,"position":5},"title":"Java 12 : quoi de neuf ?","author":"admin","date":"mercredi 23 janvier 2019","format":false,"excerpt":"Maintenant que Java 12 est features complete (Rampdown Phase 2 au jour d'\u00e9criture de l'article), c'est le moment de faire le tour des fonctionnalit\u00e9s qu'apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait parti d'une suite d'article sur les nouveaut\u00e9s des derni\u00e8res version 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\/979","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=979"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/979\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}