{"id":1474,"date":"2022-07-12T12:32:33","date_gmt":"2022-07-12T10:32:33","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1474"},"modified":"2022-12-14T17:47:01","modified_gmt":"2022-12-14T16:47:01","slug":"java-19-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-19-quoi-de-neuf\/","title":{"rendered":"Java 19 : quoi de neuf ?"},"content":{"rendered":"<p>Maintenant que Java 19 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-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 405 : Record Patterns (Preview)<\/h2>\n<p>Cette JEP vise \u00e0 enrichir le pattern matching de Java avec les record patterns qui permettent de d\u00e9construire un record en ses attributs.<\/p>\n<p>Un record est un nouveau type dont le but est d&rsquo;\u00eatre un conteneur de donn\u00e9e, il a \u00e9t\u00e9 introduit en <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-14-quoi-de-neuf\/\">Java 14<\/a>.<\/p>\n<p>Avant la JEP 405, si vous vouliez faire du pattern matching sur un record puis acc\u00e9der \u00e0 ses attributs, vous auriez \u00e9crit du code comme celui-ci :<\/p>\n<pre>\nrecord Point(int x, int y) {}\n\nstatic void printSum(Object o) {\n    if (o instanceof Point p) {\n        int x = p.x();\n        int y = p.y();\n        System.out.println(x + y);\n    }\n}\n<\/pre>\n<p>La JEP 405 permet de d\u00e9construire le record et de directement acc\u00e9der \u00e0 ses attributs quand le pattern match, ce qui simplifie le code comme suit :<\/p>\n<pre>\nrecord Point(int x, int y) {}\n\nvoid printSum(Object o) {\n    if (o instanceof Point(int x, int y)) {\n        System.out.println(x + y);\n    }\n}\n<\/pre>\n<p>Au lieu, dans le bloc de code ex\u00e9cut\u00e9 au match du pattern, d&rsquo;avoir acc\u00e8s \u00e0 la variable <code>Point p<\/code>; vous avez acc\u00e8s directement aux attribut <code>int x, int y<\/code> du record <code>Point<\/code>.<\/p>\n<p>C&rsquo;est la premi\u00e8re \u00e9tape dans la d\u00e9construction de type en Java, on peut esp\u00e9rer voir prochainement la d\u00e9construction arriver pour toutes les classes et pas uniquement les records.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/405\" rel=\"noopener\" target=\"_blank\">JEP 405<\/a>.<\/p>\n<h2>JEP 422 : Linux\/RISC-V Port<\/h2>\n<p>RISC-V est une architecture de jeu d&rsquo;instructions (Instruction Set Architecture &#8211; ISA) RISC (Reduced Instruction Set Computer) gratuite et open source con\u00e7ue \u00e0 l&rsquo;origine \u00e0 l&rsquo;Universit\u00e9 de Californie \u00e0 Berkeley, et maintenant d\u00e9velopp\u00e9e en collaboration sous le parrainage de RISC-V International : <a href=\"https:\/\/riscv.org\" rel=\"noopener\" target=\"_blank\"><a href=\"https:\/\/riscv.org\">https:\/\/riscv.org<\/a><\/a>.<\/p>\n<p>RISC-V d\u00e9finit plusieurs ISA, seul le jeu d&rsquo;instruction RV64GV (general purpose 64bit) a \u00e9t\u00e9 port\u00e9.<\/p>\n<p>Ce port comprend le support du JIT (C1 et C2) ainsi que de tous les GC existant (y compris ZGZ et Shenandoah).<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/422\" rel=\"noopener\" target=\"_blank\">JEP 422<\/a>.<\/p>\n<h2>JEP 425 : Virtual Threads (Preview)<\/h2>\n<blockquote>Virtual threads are lightweight threads that dramatically reduce the effort of writing, maintaining, and observing high-throughput concurrent applications.<\/blockquote>\n<p>La JEP 425 introduit en preview feature les Virtual Threads (parfois aussi nomm\u00e9s green threads ou lightweight threads), ce sont des threads l\u00e9gers, avec un co\u00fbt de cr\u00e9ation et de scheduling faible, qui permettent de faciliter l&rsquo;\u00e9criture d&rsquo;application concurrente.<\/p>\n<p>C&rsquo;est le projet <strong>Loom <\/strong> d&rsquo;OpenJDK.<\/p>\n<p>Les threads Java classiques sont impl\u00e9ment\u00e9s via des threads OS, quel est le probl\u00e8me avec cette impl\u00e9mentation de thread ?<\/p>\n<ul><li>Cr\u00e9er un thread en Java implique de cr\u00e9er thread OS et donc un appel syst\u00e8me, ce qui est couteux.<\/li>\n\n<li>Un thread a une stack de taille fixe, par d\u00e9faut de 1Mo sur Linux amd64, configurable via <code>-Xss<\/code> ou <code>-XX:ThreadStackSize<\/code>.<\/li>\n\n<li>Un thread sera schedul\u00e9 via le scheduler de l&rsquo;OS, chaque changement d&rsquo;ex\u00e9cution d&rsquo;un thread entra\u00eenera donc un context switch qui est une op\u00e9ration couteuse.<\/li>\n<\/ul>\n<p>Pour palier \u00e0 ces probl\u00e8mes, les applications concurrentes ont eu recours \u00e0 plusieurs types de construction :<\/p>\n<ul><li>Les pools de threads qui permettent de r\u00e9utiliser un thread pour plusieurs requ\u00eates (HTTP, JDBC, &#8230;). Le degr\u00e9 de concurrence de l&rsquo;application est donc la taille du pool.<\/li>\n\n<li>La programmation r\u00e9active qui va ouvrir un nombre de threads tr\u00e8s r\u00e9duit (1 ou 2 par unit\u00e9 de CPU), et se baser sur un syst\u00e8me d&rsquo;event loop pour traiter un ensemble de requ\u00eates concurrentes sur ces quelques threads.<\/li>\n<\/ul>\n<p>Mais ces constructions impliquent de la complexit\u00e9 lors du d\u00e9veloppement des applications. L&rsquo;id\u00e9e des Virtual Threads est d&rsquo;offrir des threads peu couteux \u00e0 cr\u00e9er, et donc de permettre de se passer de pool de threads ou d&rsquo;event loop et d&rsquo;utiliser un thread pour chaque requ\u00eate. C&rsquo;est la promesse du projet Loom.<\/p>\n<p>Le principe est de proposer des threads virtuels qui sont cr\u00e9\u00e9s et schedul\u00e9s par la JVM, et utilisent un pool de thread OS, ce que l&rsquo;on appelle des carrier threads (thread porteur). La JVM va alors automatiquement monter et d\u00e9monter les threads virtuels des carrier threads quand n\u00e9cessaire (lors des I\/O par exemple). Les stacks des threads seront stock\u00e9es dans la heap de la JVM, leur taille n&rsquo;\u00e9tant plus fixe, un gain en m\u00e9moire est possible.<\/p>\n<p>La mani\u00e8re la plus simple de cr\u00e9er des threads virtuels est via <code>Executors.newVirtualThreadPerTaskExecutor()<\/code>, on a alors un <code>ExecutorService<\/code> qui ex\u00e9cutera chaque t\u00e2che dans un nouveau thread virtuel.<\/p>\n<p>L\u00e0 o\u00f9 les threads virtuels sont le plus int\u00e9ressant est pour les applications qui n\u00e9cessitent une grande concurrence (plusieurs dizaines de milliers de thread) et\/ou qui ne sont pas CPU bound (g\u00e9n\u00e9ralement celles ex\u00e9cutant des I\/O). Attention, utiliser des threads virtuels pour des applications CPU bound, des applications faisant des calculs intense par exemple, est contre-productif, car avoir plus de threads que de CPU pour ce type d&rsquo;application impact n\u00e9gativement les performances.<\/p>\n<p>Il existe des limitations dans l&rsquo;impl\u00e9mentation actuelle des threads virtuels, dans certains cas un thread virtuel va \u00e9pingler (pinning) le carrier thread qui ne pourra pas traiter d&rsquo;autres threads virtuels :<\/p>\n<ul><li>L&rsquo;utilisation du mot cl\u00e9 <code>synchronized<\/code><\/li>\n\n<li>L&rsquo;utilisation de m\u00e9thode <code>native<\/code> ou de l&rsquo;API Foreign Function de la <a href=\"https:\/\/openjdk.org\/jeps\/424\" rel=\"noopener\" target=\"_blank\">JEP 424<\/a><\/li>\n<\/ul>\n<p>\u00c0 cause de ces limitations, les threads virtuels ne sont pas forc\u00e9ment la solution \u00e0 tous les probl\u00e8mes de concurrence, m\u00eame si des am\u00e9liorations pourrons \u00eatre faites dans les prochaines version de Java. Il faudra aussi que l&rsquo;\u00e9cosyst\u00e8me devienne compatible avec les threads virtuels (par exemple en \u00e9vitant l&rsquo;utilisation de bloc synchronis\u00e9).<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/425\" rel=\"noopener\" target=\"_blank\">JEP 425<\/a>.<\/p>\n<h2>JEP 428 : Structured Concurrency (Incubator)<\/h2>\n<blockquote>Simplify multithreaded programming by introducing a library for structured concurrency. Structured concurrency treats multiple tasks running in different threads as a single unit of work, thereby streamlining error handling and cancellation, improving reliability, and enhancing observability.<\/blockquote>\n<p>Incubator module qui offre une nouvelle API permettant de simplifier l&rsquo;\u00e9criture de code multi-thread\u00e9 en permettant de traiter plusieurs t\u00e2ches concurrentes comme une unit\u00e9 de traitement unique.<\/p>\n<p>M\u00eame si les Virtual Threads sont les stars de cette nouvelle version de Java, l&rsquo;API Structured Concurrency est pour moi aussi int\u00e9ressante, si ce n&rsquo;est plus, en tout cas pour un d\u00e9veloppeur, car va impacter fortement la mani\u00e8re d&rsquo;\u00e9crire du code multi-thread\u00e9 \/ concurrent.<\/p>\n<p>Le but de cette API est de pouvoir \u00e9crire un code multi-thread\u00e9 plus lisible et avec moins de risque d&rsquo;erreur dans son impl\u00e9mentation via une meilleure gestion des erreurs.<\/p>\n<p>Avant la Structured Concurrency API, pour ex\u00e9cuter un ensemble de t\u00e2ches concurrentes, puis joindre les r\u00e9sultats ; on \u00e9crivait un code comme celui-ci (exemple pris de la JEP).<\/p>\n<pre>\nExecutorService ex = Executors.newFixedThreadPool(nbCores);\nResponse handle() throws ExecutionException, InterruptedException {\n    Future  user  = es.submit(() -&gt; findUser());\n    Future order = es.submit(() -&gt; fetchOrder());\n    String theUser  = user.get();   \/\/ Join findUser \n    int    theOrder = order.get();  \/\/ Join fetchOrder\n    return new Response(theUser, theOrder);\n}\n<\/pre>\n<p>Il y a plusieurs probl\u00e8mes ici :<\/p>\n<ul><li>Si une erreur arrive dans la m\u00e9thode <code>fetchOrder()<\/code>, on va quand m\u00eame attendre la fin de la t\u00e2che <code>findUser()<\/code><\/li>\n\n<li>Si une erreur arrive dans la m\u00e9thode <code>findUser()<\/code>, alors la m\u00e9thode <code>handle()<\/code> va se terminer, mais le thread qui ex\u00e9cute <code>fetchOrder()<\/code> va continuer \u00e0 s&rsquo;ex\u00e9cuter, c&rsquo;est un thread leak.<\/li>\n\n<li>Si la m\u00e9thode <code>handle()<\/code> est interrompue, cette interruption n&rsquo;est pas propag\u00e9e aux sous-t\u00e2ches et leurs threads vont continuer \u00e0 s&rsquo;ex\u00e9cuter, c&rsquo;est un thread leak.<\/li>\n<\/ul>\n<p>Avec la Structured Concurrency API, on peut utiliser la classe <code>StructuredTaskScope<\/code> qui permet de lancer un ensemble de t\u00e2ches et de les g\u00e9rer comme une unit\u00e9 de traitement unique. Le principe est de d\u00e9couper une t\u00e2che en sous t\u00e2che (via <code>fork()<\/code>) qui vont se terminer au m\u00eame endroit : <code>scope.join()<\/code>. Voici l&rsquo;exemple pris de la JEP.<\/p>\n<pre>\nResponse handle() throws ExecutionException, InterruptedException {\n    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {\n        Future  user  = scope.fork(() -&gt; findUser()); \n        Future order = scope.fork(() -&gt; fetchOrder());\n\n        scope.join();          \/\/ Join both forks\n        scope.throwIfFailed(); \/\/ ... and propagate errors\n\n        \/\/ Here, both forks have succeeded, so compose their results\n        return new Response(user.resultNow(), order.resultNow());\n    }\n}\n<\/pre>\n<p>Ici les deux sous-t\u00e2ches <code>findUser()<\/code> et <code>fetchOrder()<\/code> sont d\u00e9marr\u00e9s dans leur propre thread (par d\u00e9faut un thread virtuel), mais sont jointes et potentiellement annul\u00e9es ensemble (comme une une unit\u00e9 de traitement). Leurs exceptions et leurs r\u00e9sultats seront agr\u00e9g\u00e9s dans la t\u00e2che parente, et toute interruption du thread parent sera propag\u00e9 aux threads enfants. Lors d&rsquo;un thread dump, on verra bien les sous-t\u00e2ches comme enfants du thread parent, facilitant le debugging de code \u00e9crit de cette mani\u00e8re.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/428\" rel=\"noopener\" target=\"_blank\">JEP 428<\/a>.<\/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<p>Pour les d\u00e9tails sur celles-ci, vous pouvez vous r\u00e9f\u00e9rer \u00e0 mes articles pr\u00e9c\u00e9dents.<\/p>\n<ul><li><a href=\"https:\/\/openjdk.java.net\/jeps\/426\" rel=\"noopener\" target=\"_blank\">JEP-426<\/a> &#8211; Vector API : quatri\u00e8me incubation de la fonctionnalit\u00e9. Cette nouvelle version s&rsquo;int\u00e8gre avec la Foreign Function &amp; Memory API en permettant de lire\/\u00e9crire un vector depuis un <code>MemorySegments<\/code>.<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/424\" rel=\"noopener\" target=\"_blank\">JEP-424<\/a> &#8211; Foreign Function &amp; Memory API : apr\u00e8s deux incubations pour ces deux fonctionnalit\u00e9s rassembl\u00e9es dans une m\u00eame JEP, celles-ci passent en preview.<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/427\" rel=\"noopener\" target=\"_blank\">JEP-427<\/a> &#8211; Pattern Matching for switch : troisi\u00e8me preview avec l&rsquo;introduction de la clause<code>when<\/code> pour les guards \u00e0 la place du <code>&amp;&amp;<\/code>.<\/li>\n<\/ul>\n<h2>Divers<\/h2>\n<p>Divers ajouts au JDK :<\/p>\n<ul><li><code>BigInteger.parallelMultiply()<\/code> : identique \u00e0 <code>BigInteger.parallelMultiply()<\/code> mais va utiliser un algorithme parall\u00e8le qui utilisera plus de ressources CPU et m\u00e9moire pour les grands nombres.<\/li>\n\n<li><code>Integer<\/code> et <code>Long<\/code> voient l&rsquo;ajout des m\u00e9thodes <code>compress<\/code> et <code>expand<\/code><\/li>\n\n<li><code>HashMap.newHashMap(int)<\/code>, <code>HashSet.newHashSet(int)<\/code>, <code>LinkedHashMap.newLinkedHashMap(int)<\/code> et <code>LinkedHashSet.newLinkedHashSet(int)<\/code> : ces m\u00e9thodes permettent de cr\u00e9er des maps ou des sets pouvant accueillir le nombre d&rsquo;\u00e9l\u00e9ments pass\u00e9 en param\u00e8tre sans d\u00e9clencher de resize.<\/li>\n\n<li>Les constructeurs de la classe <code>Locale<\/code> ont \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9s, il faut maintenant construire une locale via <code>Locale.of()<\/code>.<\/li>\n<\/ul>\n<p>La totalit\u00e9 des nouvelles API du JDK 19 peuvent \u00eatre trouv\u00e9es dans <a href=\"https:\/\/javaalmanac.io\/jdk\/19\/apidiff\/18\/\" rel=\"noopener\" target=\"_blank\">The Java Version Almanac &#8211; New APIs in Java 19<\/a>.<\/p>\n<h2>Des changements internes, de la performance, et de la s\u00e9curit\u00e9<\/h2>\n<p>Chaque nouvelle version du JDK apporte ses optimisations de performances (entre autres GC et m\u00e9thodes intrisics), et de s\u00e9curit\u00e9. Celle-ci ne fait pas d\u00e9faut.<\/p>\n<p>C\u00f4t\u00e9 s\u00e9curit\u00e9, le focus a \u00e9t\u00e9 mis sur le renforcement de la s\u00e9curit\u00e9 de la JVM et les performance du TLS. Vous pouvez vous r\u00e9f\u00e9rer \u00e0 l&rsquo;article de Sean Mullan pour une liste exhaustive des changements de s\u00e9curit\u00e9 inclus cette version : <a href=\"https:\/\/seanjmullan.org\/blog\/2022\/09\/22\/jdk19\" rel=\"noopener\" target=\"_blank\">JDK 19 Security Enhancements<\/a><\/p>\n<p>Thomas Schatzl d\u00e9crit les changements c\u00f4t\u00e9 Garbage Collector inclus dans cette version dans son article <a href=\"https:\/\/tschatzl.github.io\/2022\/09\/16\/jdk19-g1-parallel-gc-changes.html\" rel=\"noopener\" target=\"_blank\">JDK 19 G1\/Parallel\/Serial GC changes<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>La tant attendue JEP 425 Virtual Threads est enfin arriv\u00e9e et pourrait bien changer la donne dans la programmation concurrente en baissant le co\u00fbt de cr\u00e9ation des threads en Java. En conjonction avec la JEP 428 qui permet d&rsquo;\u00e9crire du code concurrent plus simplement et avec une meilleure gestion des erreurs, c&rsquo;est une mini r\u00e9volution qui se pr\u00e9pare ;).<\/p>\n<p>Bien s\u00fbr, l&rsquo;adoption des virtual threads se fera lentement, car l&rsquo;\u00e9cosyst\u00e8me devra se mettre \u00e0 jour pour les supporter, mais c&rsquo;est une \u00e9tape importante pour Java et la JVM.<\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 19 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 18, Java 17, Java 16, Java 15, Java 14, Java 13, Java 12, Java 11,\u00a0Java 10,\u00a0et\u00a0Java 9. JEP 405 : Record&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-19-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,207,163],"class_list":["post-1474","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java19","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":1474,"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":1474,"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":1474,"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":1474,"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":1112,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-15-quoi-de-neuf\/","url_meta":{"origin":1474,"position":4},"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":1839,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-vers-une-integrite-par-defaut-de-la-jvm\/","url_meta":{"origin":1474,"position":5},"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":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1474","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=1474"}],"version-history":[{"count":20,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1474\/revisions"}],"predecessor-version":[{"id":1593,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1474\/revisions\/1593"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1474"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1474"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1474"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}