{"id":1215,"date":"2021-01-29T11:31:02","date_gmt":"2021-01-29T10:31:02","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1215"},"modified":"2021-02-23T13:09:21","modified_gmt":"2021-02-23T12:09:21","slug":"java-16-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-16-quoi-de-neuf\/","title":{"rendered":"Java 16 : quoi de neuf ?"},"content":{"rendered":"<p>Maintenant que Java 16 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.<\/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-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>Cette nouvelle version compte pas moins de 17 JEP mais surtout voit les <strong>Records<\/strong> et le pattern matching pour <strong>instanceof<\/strong> sortir de preview et \u00e7a c&rsquo;est une bonne nouvelle !<\/p>\n<h2>JEP 380: Unix-Domain Socket Channels<\/h2>\n<p>Tout d&rsquo;abord une petite description de ce qu&rsquo;est un socket de type Unix-Domain :<\/p>\n<blockquote>Les sockets Unix-Domain sont utilis\u00e9s pour la communication inter-processus (IPC) sur le m\u00eame h\u00f4te. Ils sont similaires aux sockets TCP\/IP \u00e0 bien des \u00e9gards, sauf qu&rsquo;ils sont adress\u00e9s par path de filesystem plut\u00f4t que par des adresses IP et des num\u00e9ros de port.<\/blockquote>\n<p>Les classes <code>SocketChannel<\/code> et <code>ServerSocketChannel<\/code> peuvent dor\u00e9navant \u00eatre cr\u00e9\u00e9es depuis un socket de type Unix-Domain.<\/p>\n<p>Exemple (non test\u00e9):<\/p>\n<pre>\nServerSocketChannel serverSocketChannel = ServerSocketChannel.open();\nserverSocketChannel.socket().bind(UnixDomainSocketAddress.of(\"path\/to\/socket\/file\");\nwhile(true){\n    SocketChannel socketChannel = serverSocketChannel.accept();\n    \/\/do something with socketChannel...\n}\n<\/pre>\n<p>Plus d&rsquo;info : <a href=\"https:\/\/openjdk.java.net\/jeps\/380\" rel=\"noopener\" target=\"_blank\">JEP-380<\/a>.<\/p>\n<h2>JEP 338: Vector API (Incubator)<\/h2>\n<p>Vector API  est une nouvelle API qui permet d&rsquo;exprimer des calculs de vecteur (calcul matriciel entre autres), qui seront ex\u00e9cut\u00e9s via des instructions machines optimales en fonction de la plateforme d&rsquo;ex\u00e9cution.\nCes optimisations incluent des changements au sein du Just In Time compiler, des intrinsics, et utilisent les instructions AVX\/SSE des CPU qui permettent vectorisation des calculs (instructions de type SIMD &#8211; Single Instruction Multiple Data).<\/p>\n<p>La JEP contient l&rsquo;exemple suivant, impl\u00e9ment\u00e9 avant la Vector API par :<\/p>\n<pre>\nvoid scalarComputation(float[] a, float[] b, float[] c) {\n   for (int i = 0; i <\/pre>\n<p>Et avec la Vector API par :<\/p>\n<pre>\nstatic final VectorSpecies SPECIES = FloatVector.SPECIES_256;\n\nvoid vectorComputation(float[] a, float[] b, float[] c) {\n\n    for (int i = 0; i <\/pre>\n<p>On utilise ici un <code>FloatVector.SPECIES_256<\/code> qui permet de g\u00e9rer des vecteurs de float sur 256 bits. Les op\u00e9rations <code>mul<\/code>, <code>add<\/code> et <code>neg<\/code> seront donc faites via des instructions SIMD sur 256 bits au lieu d&rsquo;\u00eatre faites unitairement sur chaque float.<\/p>\n<p>Plus d&rsquo;info : <a href=\"https:\/\/openjdk.java.net\/jeps\/338\" rel=\"noopener\" target=\"_blank\">JEP-338<\/a>.<\/p>\n<h2>JEP 389: Foreign Linker API (Incubator)<\/h2>\n<p>Avec la JEP-393 Foreign-Memory API, qui permet de g\u00e9rer des segments m\u00e9moire (on heap ou off heap), cette nouvelle fonctionnalit\u00e9 pose les bases du projet <a href=\"https:\/\/openjdk.java.net\/projects\/panama\/\" rel=\"noopener\" target=\"_blank\">Panama<\/a> en permettant l\u2019interconnexion de la JVM avec du code natif.<\/p>\n<p>La Foreign Linker API permet d&rsquo;appeler du code natif (en C par exemple) de fa\u00e7on facile et performante.<\/p>\n<p>Voici un exemple d&rsquo;appel de la fonction <code>strlen<\/code> de la librairie standard C :<\/p>\n<pre>\nMethodHandle strlen = CLinker.getInstance().downcallHandle(\n        LibraryLookup.ofDefault().lookup(\"strlen\").get(),\n        MethodType.methodType(long.class, MemoryAddress.class),\n        FunctionDescriptor.of(C_LONG, C_POINTER)\n);\n\nlong len = strlen.invokeExact(CLinker.toCString(\"Hello\").address())\n<\/pre>\n<p>Plus d&rsquo;informations sur les appels de fonction native dans cet article de Maurizio Cimadamore : <a href=\"https:\/\/cr.openjdk.java.net\/~mcimadamore\/panama\/ffi.html\" rel=\"noopener\" target=\"_blank\">State of foreign function support<\/a>.<\/p>\n<p>Ce code peut sembler un peu complexe, c&rsquo;est pour cela qu&rsquo;a \u00e9t\u00e9 cr\u00e9\u00e9 <strong>jextract<\/strong>, qui permet d&rsquo;extraire le code n\u00e9cessaire \u00e0 l&rsquo;appel d&rsquo;une librairie C automatiquement depuis un fichier header C.<\/p>\n<p>Exemple pour l&rsquo;appel de la m\u00e9thode <code>getpid<\/code> de la librairie standard C :<\/p>\n<pre>\necho \"int getpid();\" &gt; getpid.h\njextract -t com.unix getpid.h\n<\/pre>\n<pre>\nimport static com.unix.getpid_h.*;\n\nclass Main2 {\n   public static void main(String[] args) {\n      System.out.println(getpid());\n  }\n}\n<\/pre>\n<p>Plus d&rsquo;informations sur <strong>jextract<\/strong> dans cet article, de Sundar Athijegannathan : <a href=\"https:\/\/inside.java\/2020\/10\/06\/jextract\/\" rel=\"noopener\" target=\"_blank\">Project Panama and jextract<\/a>.<\/p>\n<h2>Deux nouveaux ports de la JVM<\/h2>\n<p>OpenJDK 16 ajoute le support Alpine Linux et donc <a href=\"https:\/\/musl.libc.org\/\" rel=\"noopener\" target=\"_blank\">Musl<\/a> comme impl\u00e9mentation de la librairie standard C pour les architectures x64 et AArch64. Plus d&rsquo;informations dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/386\" rel=\"noopener\" target=\"_blank\">JEP-386<\/a>.<\/p>\n<p>OpenJDK 16 ajoute aussi le support de l&rsquo;architecture AArch64 sous Windows (pr\u00e9c\u00e9demment uniquement support\u00e9 sous Linux) via la <a href=\"https:\/\/openjdk.java.net\/jeps\/388\" rel=\"noopener\" target=\"_blank\">JEP 388<\/a>. Le support de macOS sur cette architecture est en cours et sera certainement livr\u00e9 dans une prochaine version de Java, voir la <a href=\"https:\/\/openjdk.java.net\/jeps\/391\" rel=\"noopener\" target=\"_blank\">JEP 391<\/a>.<\/p>\n<h2>Les fonctionnalit\u00e9s qui passent de preview \u00e0 standard<\/h2>\n<p>Les fonctionnalit\u00e9s suivantes, qui \u00e9taient en preview (ou en incubator module), sont maintenant en standard.\nPour 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\/392\" rel=\"noopener\" target=\"_blank\">JEP 392<\/a> : Packaging Tool.<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/394\" rel=\"noopener\" target=\"_blank\">JEP 394<\/a> : Pattern Matching for instanceof.<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/395\" rel=\"noopener\" target=\"_blank\">JEP 395<\/a>: Records.<\/li>\n<\/ul>\n<h2>Les fonctionnalit\u00e9s qui restent en preview<\/h2>\n<p>Les fonctionnalit\u00e9s suivantes restent en preview (ou en incubator module).\nPour 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\/393\" rel=\"noopener\" target=\"_blank\">JEP 393<\/a> : Foreign-Memory Access API (Third Incubator)<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/397\" rel=\"noopener\" target=\"_blank\">JEP 397<\/a> : Sealed Classes (Second Preview)<\/li>\n<\/ul>\n<h2>Divers<\/h2>\n<p>Divers ajouts au JDK :<\/p>\n<ul><li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8238286\" rel=\"noopener\" target=\"_blank\">JDK-8238286<\/a> : Stream.mapMulti() : permet de mapper un \u00e9l\u00e9ment <code>T<\/code> en n \u00e9l\u00e9ments <code>R<\/code> via un <code>Consumer&lt;R&gt;<\/code><\/li>\n\n<li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8180352\" rel=\"noopener\" target=\"_blank\">JDK-8180352<\/a> : Stream.toList() : accumule les \u00e9l\u00e9ments de la Stream dans une liste immuable.<\/li>\n\n<li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8255150\" rel=\"noopener\" target=\"_blank\">JDK-8255150<\/a> : Ajout de m\u00e9thodes utilitaires pour v\u00e9rifier le range d&rsquo;un index de type long : <code>Objects.checkIndex(long index, long length)<\/code>, <code>Objects.checkFromToIndex(long fromIndex, long toIndex, long length)<\/code>, <code>Objects.checkFromIndexSize(long fromIndex, long size, long length)<\/code>. Ces nouvelles m\u00e9thodes sont optimis\u00e9es via l&rsquo;ajout d&rsquo;intrinsics.<\/li>\n<\/ul>\n<p>Lors de la modularisation du JDK via le projet Jigsaw, certaines API internes du JDK qui ne devraient pas \u00eatre utilisables en dehors de celui-ci, ont quand m\u00eame \u00e9t\u00e9 rendues utilisables (par manque d&rsquo;alternatives, ou pour donner aux applications les utilisant un temps de migration). C&rsquo;est ce qui a \u00e9t\u00e9 appel\u00e9 <a href=\"https:\/\/openjdk.java.net\/jeps\/261#Relaxed-strong-encapsulation\" rel=\"noopener\" target=\"_blank\">Relaxed Strong Encapsulation<\/a>. Un simple WARNING \u00e9tait alors affich\u00e9 dans les logs de la JVM lors de la premi\u00e8re utilisation de ces API (comportement modifiable via <code>--illegal-access<\/code>). Avec la <a href=\"https:\/\/openjdk.java.net\/jeps\/396\" rel=\"noopener\" target=\"_blank\">JEP 396<\/a> : Strongly Encapsulate JDK Internals by Default, l&rsquo;acc\u00e8s \u00e0 ces API (qui ont quasiment toutes un remplacement officiel dans le JDK), est maintenant interdit par d\u00e9faut. La valeur par d\u00e9faut du flag <code>--illegal-access<\/code> passe donc de <code>permit<\/code> \u00e0 <code>deny<\/code>. Le flag \u00e9tant toujours pr\u00e9sent on peut le modifier pour retrouver le comportement pr\u00e9c\u00e9dent si n\u00e9cessaire.<\/p>\n<p>Un changement en pr\u00e9paration des inline classes du projet Valhalla : <a href=\"https:\/\/openjdk.java.net\/jeps\/390\" rel=\"noopener\" target=\"_blank\">JEP 390<\/a> : Warnings for Value-Based Classes. Certaines classes du JDK sont appel\u00e9es <strong>Value-Based Classes<\/strong>, ce sont des classes qui ne sont que des v\u00e9hicules pour de la donn\u00e9e (data carier), et sont donc susceptibles d&rsquo;\u00eatre transform\u00e9es en Inline Classes quand le projet Valhalla sortira. C&rsquo;est le cas par exemple de la classe <code>Optional<\/code> ou des wrappers sur les primitives.<\/p>\n<p>\u00c0 partir de Java 16, l&rsquo;utilisation de ces classes d&rsquo;une mani\u00e8re incompatible avec les inline classes va g\u00e9n\u00e9rer des warnings : utilisation des constructeurs (qui sont d\u00e9pr\u00e9ci\u00e9s), synchronisation, utilisation incorrecte du == ou du !=.<\/p>\n<h2>Performance<\/h2>\n<p>Beaucoup d&rsquo;intrinsics ont \u00e9t\u00e9 ajout\u00e9s \u00e0 la JVM :<\/p>\n<ul><li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8250902\" rel=\"noopener\" target=\"_blank\">JDK-8250902<\/a> : MD5 intrinsic.<\/li>\n\n<li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8248188\" rel=\"noopener\" target=\"_blank\">JDK-8248188<\/a> : Base64 intrinsic. <\/li>\n\n<li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8173585\" rel=\"noopener\" target=\"_blank\">JDK-8173585<\/a> : Intrinsic pour StringLatin1.indexOf(char).<\/li>\n\n<li>Intrinsics d\u00e9di\u00e9s pour AArch64 (d\u00e9j\u00e0 pr\u00e9sent sur d&rsquo;autres plateformes) : <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8173585\" rel=\"noopener\" target=\"_blank\">JDK-8173585<\/a>, <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8173585\" rel=\"noopener\" target=\"_blank\">JDK-8173585<\/a>, <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8173585\" rel=\"noopener\" target=\"_blank\">JDK-8173585<\/a>.<\/li>\n<\/ul>\n<h2>Temps de d\u00e9marrage<\/h2>\n<p>Java 16 a vu son lot d&rsquo;optimisations du temps de d\u00e9marrage de la JVM. Claes Redestad, l&rsquo;un des ing\u00e9nieurs de chez Oracle qui travaille sur le sujet, a \u00e9crit un article assez int\u00e9ressant qui reprend les diff\u00e9rentes optimisations du temps de d\u00e9marrage de la JVM depuis Java 8 et se pose la question des optimisations encore \u00e0 faire pour Java 17 : <a href=\"https:\/\/cl4es.github.io\/2020\/12\/06\/Towards-OpenJDK-17.html\" rel=\"noopener\" target=\"_blank\">Towards OpenJDK 17<\/a>.<\/p>\n<p>Release apr\u00e8s release, le temps de d\u00e9marrage de la JVM \u00e0 quasiment \u00e9t\u00e9 divis\u00e9 par deux depuis Java 8 (apr\u00e8s un accroissement non n\u00e9gligeable en Java 9 suite \u00e0 l&rsquo;introduction des modules). Sachant qu&rsquo;une JVM d\u00e9marre en moins de 40ms, Claes se pose la question de savoir si c&rsquo;est encore n\u00e9cessaire de travailler sur le sujet ?<\/p>\n<p>Pour ce qui concerne Java 16, on peut noter, entre autre, de nombreuses am\u00e9liorations de la fonctionnalit\u00e9 CDS :<\/p>\n<ul><li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8244778\" rel=\"noopener\" target=\"_blank\">JDK-8244778<\/a> : Archive full module graph in CDS<\/li>\n\n<li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8247536\" rel=\"noopener\" target=\"_blank\">JDK-8247536<\/a> : Support for pre-generated java.lang.invoke classes in CDS static archive<\/li>\n\n<li><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8247666\" rel=\"noopener\" target=\"_blank\">JDK-8247666<\/a> : Support Lambda proxy classes in static CDS archive<\/li>\n<\/ul>\n<p>CDS &#8211; Class Data Sharing, permet d&rsquo;enregistrer dans une archive les donn\u00e9es des metadatas des classes lors du lancement de la JVM, pour les r\u00e9utiliser lors de lancements successifs, optimisant alors le temps de d\u00e9marrage de cette derni\u00e8re.\nVous pourrez trouver plus d&rsquo;informations dans mon article <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/quarkus-jlink-et-application-class-data-sharing-appcds\/\" rel=\"noopener\" target=\"_blank\">QUARKUS, JLINK ET APPLICATION CLASS DATA SHARING (APPCDS)<\/a>.<\/p>\n<p>La JVM contient une archive par d\u00e9faut avec les metadatas de certaines classes du JDK, des changements sur la fonctionnalit\u00e9 CDS profitent donc automatiquement \u00e0 tout le monde.<\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 16 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 voudraient les lire en voici les liens : Java 15, Java 14, Java 13, Java 12, Java 11,\u00a0Java 10,\u00a0et\u00a0Java 9. Cette nouvelle version compte pas moins de 17 JEP mais&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-16-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,191,163],"class_list":["post-1215","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java16","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":1215,"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":1215,"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":1215,"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":1215,"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":1215,"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":1215,"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\/1215","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=1215"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1215\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}