{"id":1946,"date":"2025-07-04T10:47:15","date_gmt":"2025-07-04T08:47:15","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1946"},"modified":"2026-01-21T17:56:32","modified_gmt":"2026-01-21T16:56:32","slug":"java-25-whats-new","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-25-quoi-de-neuf\/","title":{"rendered":"Java 25 : Quoi de neuf?"},"content":{"rendered":"<p>Maintenant que Java 25 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-24-quoi-de-neuf\/\">Java 24<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-23-quoi-de-neuf\/\">Java 23<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-22-quoi-de-neuf\/\">Java 22<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-21-quoi-de-neuf\/\">Java 21<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-20-quoi-de-neuf\/\">Java 20<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-19-quoi-de-neuf\/\">Java 19<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-18-quoi-de-neuf\/\">Java 18<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-17-quoi-de-neuf\/\">Java 17<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-16-quoi-de-neuf\/\">Java 16<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-15-quoi-de-neuf\/\">Java 15<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-14-quoi-de-neuf\/\">Java 14<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-13-quoi-de-neuf\/\">Java 13<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-12-quoi-de-neuf\/\">Java 12<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-11-quoi-de-neuf\/\">Java 11<\/a>,\u00a0<a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-10-quoi-de-neuf\/\">Java 10,<\/a>\u00a0et\u00a0<a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\/\">Java 9<\/a>.<\/p>\n<p>Java 25 est la nouvelle version \u00e0 support \u00e0 long terme (LTS), elle contient pas moins de 18 JEPs. M\u00eame si c&rsquo;est moins bien que les 24 JEPs de Java 24 c&rsquo;est quand m\u00eame un chiffre assez important.\nPas de grosses nouveaut\u00e9s au programme, mais plusieurs petites nouveaut\u00e9s sympas tout de m\u00eame.<\/p>\n<h2>JEP 470: PEM Encodings of Cryptographic Objects (Preview)<\/h2>\n<p>Nouvelle fonctionnalit\u00e9 en preview qui apporte le support du format <a href=\"https:\/\/en.wikipedia.org\/wiki\/Privacy-Enhanced_Mail\" title=\"Privacy-Enhanced Mail wikipedia page\" rel=\"noopener\" target=\"_blank\">Privacy-Enhanced Mail<\/a> (PEM) \u00e0 Java.<\/p>\n<p>Ce format est tr\u00e8s r\u00e9pandu pour communiquer, par exemple, des cl\u00e9s ou des certificats, car c&rsquo;est un format textuel simple \u00e0 utiliser. C&rsquo;est aussi un standard de <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc5208\" title=\"PKCS#8 standard\" rel=\"noopener\" target=\"_blank\">PKCS#8<\/a>.<\/p>\n<p>Ce format est maintenant support\u00e9 pour les cl\u00e9s priv\u00e9es, les cl\u00e9s publiques, les certificats et les listes de r\u00e9vocations de certificats.<\/p>\n<p>Un texte PEM est une repr\u00e9sentation encod\u00e9e en Base64 d&rsquo;un objet cryptographique.\nPar exemple, pour une cl\u00e9 publique de type elliptic curve :<\/p>\n<pre>\n-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEi\/kRGOL7wCPTN4KJ2ppeSt5UYB6u\ncPjjuKDtFTXbguOIFDdZ65O\/8HTUqS\/sVzRF+dg7H3\/tkQ\/36KdtuADbwQ==\n-----END PUBLIC KEY----- \n<\/pre>\n<p>Pour encoder un objet cryptographique au format PEM on va utiliser la nouvelle classe <code>PEMEncoder<\/code> :<\/p>\n<pre>\nPEMencoder pe = PEMEncoder.of();\n\n\/\/ plaintext\nbyte[] pem = pe.encode(publicKey);\n\n\/\/ password encrypted\nbyte[] pemWithPassword = pe.withEncryption(password).encode(privateKey);\n<\/pre>\n<p>On peut fournir un mot de passe pour encoder le texte PEM avec la m\u00e9thode <code>withEncryption()<\/code> ; on peut aussi directement encoder en String via la m\u00e9thode <code>encodeToString()<\/code>.<\/p>\n<p>Pour d\u00e9coder un texte PEM en un objet cryptographique, on va utiliser la nouvelle classe <code>PEMDecoder<\/code> :<\/p>\n<pre>\nPEMDecoder pd = PEMDecoder.of();\n\n\/\/ plaintext\nCertificate cert = pd.decode(pem, X509Certificate.class);\n\n\/\/ password encrypted\nCertificate certWithPassord = pd.withDecryption(password)\n    .decode(pem, X509Certificate.class);\n<\/pre>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/570\" title=\"JEP 470\" rel=\"noopener\" target=\"_blank\">JEP 470<\/a>.<\/p>\n<h2>JEP 502: Stable Values (Preview)<\/h2>\n<p>Nouvelle fonctionnalit\u00e9 en preview qui permet de cr\u00e9er des variables <em>stables<\/em> qui vont se comporter comme des variables finales mais avec une plus grande flexibilit\u00e9 pour leur initialisation.<\/p>\n<p>Une stable value ne peut \u00eatre initialis\u00e9e qu&rsquo;une seule fois et est immuable.<\/p>\n<p>Il est assez classique de retarder l&rsquo;initialisation d&rsquo;un attribut d&rsquo;une classe lors de sa premi\u00e8re utilisation pour \u00e9viter de ralentir le d\u00e9marrage de l&rsquo;application, ou m\u00eame \u00e9viter d&rsquo;initialiser un attribut non utilis\u00e9 !\nPour faire \u00e7a de mani\u00e8re coh\u00e9rente et s\u00fbre dans des sc\u00e9narios multi-thread, il faut utiliser une construction assez compliqu\u00e9e \u00e0 base de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Double-checked_locking\" rel=\"noopener\" target=\"_blank\">double-checked locking<\/a> ou de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Initialization-on-demand_holder_idiom\" rel=\"noopener\" target=\"_blank\">class-holder idiom<\/a>.<\/p>\n<p>Avec les Stable Values, nous avons maintenant une API pour \u00e7a !<\/p>\n<pre>\nprivate final StableValue logger = StableValue.of();\n\nLogger getLogger() {\n    return logger.orElseSet(() -&gt; Logger.create(MyClass.class));\n}\n\nvoid saySomething() {\n    getLogger().info(\"I have nothing to say\");\n}\n<\/pre>\n<p>Il y a plusieurs mani\u00e8res de cr\u00e9er des stable values, au lieu d&rsquo;utiliser <code>orElseSet()<\/code> on peut utiliser un supplier, exemple :<\/p>\n<pre>\nprivate final Supplier logger = StableValue\n    .supplier(() -&gt; Logger.create(MyClass.class));\n\nvoid saySomething() {\n    logger.get().info(\"I have nothing to say\");\n}\n<\/pre>\n<p>La JVM va garantir que la stable value <code>logger<\/code> va \u00eatre initialis\u00e9 une et une seule fois, lors de sa premi\u00e8re utilisation, et va permettre au JIT d&rsquo;en optimiser l&rsquo;utilisation (constant folding).<\/p>\n<p>Il est aussi possible de construire une liste de stable values, dont chaque \u00e9l\u00e9ment va \u00eatre initialis\u00e9 une seule fois lors de son premier acc\u00e8s. Tr\u00e8s pratique pour cr\u00e9er des pools d&rsquo;objets.<\/p>\n<pre>\nstatic final List connections = StableValue\n    .list(POOL_SIZE, _ -&gt; new Connection());\n\nvoid doSomething() {\n    long index = Thread.currentThread().threadId() % POOL_SIZE;\n    Connection con = connections.get((int) index);\n}\n<\/pre>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/502\" title=\"JEP 502\" rel=\"noopener\" target=\"_blank\">JEP 502<\/a>.<\/p>\n<h2>JEP 503: Remove the 32-bit x86 Port<\/h2>\n<p>Le port 32-bit pour les architectures x86 de la JVM a \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9 en Java 24 avec l&rsquo;intention de le supprimer dans une release future, c&rsquo;est d\u00e9sormais chose faite.<\/p>\n<p>Le co\u00fbt de maintenance et de d\u00e9veloppement de nouvelles fonctionnalit\u00e9s induit par ce port ne valait pas la peine, car cette architecture n&rsquo;est quasiment plus utilis\u00e9e. Cela n&rsquo;impacte pas les autres architecture 32-bit tels que ARM32.<\/p>\n<p>Pour les architectures non support\u00e9es, il existe un port de la JVM sans sp\u00e9cificit\u00e9 d&rsquo;architecture : le port Zero, qui permettra toujours de faire tourner une JVM sous architecture 32-bit x86.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/503\" title=\"JEP 503\" rel=\"noopener\" target=\"_blank\">JEP 503<\/a>.<\/p>\n<h2>509: JFR CPU-Time Profiling (Experimental)<\/h2>\n<p>Fonctionnalit\u00e9 exp\u00e9rimentale qui ajoute la capture des informations de profiling du temps CPU sous Linux \u00e0 Java Flight Recorder (JFR).<\/p>\n<p>JFR est l&rsquo;outil de monitoring de production de la JVM, il a un overhead faible et permet d\u00e9j\u00e0 de monitorer l&rsquo;utilisation m\u00e9moire d&rsquo;une m\u00e9thode et son temps d&rsquo;ex\u00e9cution (wall-clock time).<\/p>\n<p>Pour monitorer le temps d&rsquo;ex\u00e9cution d&rsquo;une m\u00e9thode, JFR va sampler la stack d\u2019ex\u00e9cution d&rsquo;un programme \u00e0 intervalles r\u00e9guliers, par exemple toutes les 20ms.<\/p>\n<p>Le temps d&rsquo;ex\u00e9cution d&rsquo;une m\u00e9thode n&rsquo;est pas forc\u00e9ment le temps CPU, par exemple, une m\u00e9thode faisant des calculs en m\u00e9moire comme un tri de tableau va principalement consommer du CPU donc son temps d&rsquo;ex\u00e9cution sera quasiment \u00e9quivalent au temps CPU, au contraire, une m\u00e9thode acc\u00e9dant  \u00e0 une ressource r\u00e9seau va principalement attendre des I\/O et va donc avoir un temps CPU tr\u00e8s faible.<\/p>\n<p>Les syst\u00e8mes Linux supportent la mesure pr\u00e9cise de la consommation des cycles CPU via l&rsquo;\u00e9mission de signaux \u00e0 intervalles r\u00e9guliers. C&rsquo;est ce qui est utilis\u00e9 par la plupart des profilers Linux et dans le monde Java, par exemple par <a href=\"https:\/\/github.com\/async-profiler\/async-profiler\" rel=\"noopener\" target=\"_blank\">async-profiler<\/a>.<\/p>\n<p>Avec la JEP 509, JFR peut maintenant utiliser le m\u00e9canisme offert par Linux pour \u00e9mettre un nouvel \u00e9v\u00e9nement de monitoring: <code>jdk.CPUTimeSample<\/code>, ce nouvel \u00e9v\u00e9nement n&rsquo;est pas actif par d\u00e9faut.<\/p>\n<p>La ligne de commande suivante va activer l\u2019\u00e9v\u00e9nement au lancement de l&rsquo;application :<\/p>\n<pre>\njava -XX:StartFlightRecording=jdk.CPUTimeSample#enabled=true,filename=profile.jfr ...\n<\/pre>\n<p>Pour aller plus loin, vous pouvez lire ces articles fort int\u00e9ressants de Johannes Bechberger <a href=\"https:\/\/mostlynerdless.de\/blog\/2025\/06\/11\/java-25s-new-cpu-time-profiler-1\/\" rel=\"noopener\" target=\"_blank\">Java 25\u2019s new CPU-Time Profiler (1)<\/a>  et <a href=\"https:\/\/mostlynerdless.de\/blog\/2025\/07\/30\/java-25s-new-cpu-time-profiler-the-implementation-2\/\" rel=\"noopener\" target=\"_blank\">Java 25\u2019s new CPU-Time Profiler: The Implementation (2)<\/a>.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/509\" title=\"JEP 509\" rel=\"noopener\" target=\"_blank\">JEP 509<\/a>.<\/p>\n<h2>514: Ahead-of-Time Command-Line Ergonomics<\/h2>\n<p>La <a href=\"https:\/\/openjdk.org\/jeps\/483\" rel=\"noopener\" target=\"_blank\">JEP 483: Ahead-of-Time Class Loading &amp; Linking<\/a> a introduit en Java 24 la possibilit\u00e9 de cr\u00e9er un cache AOT (Ahead of Time &#8211; avant le lancement de l&rsquo;application) contenant les classes d\u00e9j\u00e0 charg\u00e9es et li\u00e9es d&rsquo;une application pour am\u00e9liorer son temps de d\u00e9marrage.<\/p>\n<p>Cela devait se faire en trois \u00e9tapes :<\/p>\n<ol><li>Lancement de l&rsquo;application pour enregistrer la liste des classes utilis\u00e9es<\/li>\n\n<li>Cr\u00e9ation du cache AOT<\/li>\n\n<li>Lancement de l&rsquo;application avec le cache AOT<\/li>\n<\/ol>\n<p>Avec la JEP 514, ce processus est simplifi\u00e9, il est maintenant faisable en deux \u00e9tapes uniquement, les deux premi\u00e8res \u00e9tapes pouvant \u00eatre faites en une seule via la ligne de commande :<\/p>\n<pre>\njava -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App ...\n<\/pre>\n<p>La liste des classes sera enregistr\u00e9e pendant le fonctionnement de l&rsquo;application, puis le cache AOT sera cr\u00e9\u00e9 quand l&rsquo;application sera arr\u00eat\u00e9e.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/514\" title=\"JEP 514\" rel=\"noopener\" target=\"_blank\">JEP 514<\/a>.<\/p>\n<h2>515: Ahead-of-Time Method Profiling<\/h2>\n<p>Le cache AOT pr\u00e9sent\u00e9 dans la section pr\u00e9c\u00e9dente s&rsquo;enrichit des informations de profiling des m\u00e9thodes !<\/p>\n<p>Au d\u00e9marrage d&rsquo;une application Java, le Just-In-Time compiler (JIT) va profiler les m\u00e9thodes Java pour savoir lesquelles doivent \u00eatre compil\u00e9es (celles qui sont fr\u00e9quemment utilis\u00e9es) et guider ces optimisations via de nombreuses heuristiques (branches les plus utilis\u00e9es, taille des boucles, &#8230;). C&rsquo;est seulement apr\u00e8s que ces informations de profiling auront \u00e9t\u00e9 collect\u00e9es que le JIT va pouvoir compiler puis optimiser les classes de l&rsquo;application.<\/p>\n<p>La JEP 515 va \u00e9tendre le cache AOT pour y ajouter les informations de profiling des m\u00e9thodes, ce qui permettra au JIT de commencer avec des informations de profiling, et \u00e0 l&rsquo;application de d\u00e9marrer plus rapidement et d&rsquo;attendre plus rapidement ses performances de pointe.\nLe JIT collectera toujours des statistiques au runtime.<\/p>\n<p>Des tests pr\u00e9liminaires montrent une am\u00e9lioration de performance de 19% d&rsquo;un programme simple utilisant l&rsquo;API Stream pour une augmentation de la taille du cache AOT de seulement 2,5%.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/515\" title=\"JEP 515\" rel=\"noopener\" target=\"_blank\">JEP 515<\/a>.<\/p>\n<h2>518: JFR Cooperative Sampling<\/h2>\n<p>Comme d\u00e9crit dans la section \u00e0 propos de la JEP 509; pour monitorer le temps d&rsquo;ex\u00e9cution d&rsquo;une m\u00e9thode, JFR va sampler la stack d\u2019ex\u00e9cution d&rsquo;un programme \u00e0 intervalles r\u00e9guliers, par exemple toutes les 20ms. Il va donc collecter l&rsquo;ensemble des stacks de tous les threads d\u00e9marr\u00e9s. Pour cela, il faut que les threads soient dans un \u00e9tat stable, coh\u00e9rent les uns avec les autres.<\/p>\n<p>Pour collecter les informations des threads, on peut utiliser le m\u00e9canisme de safepoint : la JVM demande \u00e0 tous les threads de se suspendre, ceux-ci allant jusqu&rsquo;\u00e0 un point o\u00f9 ils peuvent se suspendre sans mettre en danger l&rsquo;application : le safepoint. Ce m\u00e9canisme souffre de biais du safepoint : un thread loin d&rsquo;un safepoint prendra du temps \u00e0 se suspendre alors qu&rsquo;un autre proche le fera rapidement.<\/p>\n<p>Pour \u00e9viter ce biais, JFR scanne les threads de mani\u00e8re asynchrone et les suspend en dehors d&rsquo;un safepoint. \u00c9tant donn\u00e9 que les m\u00e9tadonn\u00e9es des stacks de threads ne sont pas garanties comme \u00e9tant valides en dehors des safepoints, JFR utilise des heuristiques afin de g\u00e9n\u00e9rer les stacks des threads.<\/p>\n<p>Ce m\u00e9canisme a \u00e9t\u00e9 refait pour analyser les stacks de threads uniquement aux safepoints, \u00e9vitant ainsi les erreurs. Pour contrer le biais de safepoint, JFR enregistre le pointeur de programme lors de la suspension, puis le thread continue et reconstitue sa stack \u00e0 son prochain safepoint. Cela permet une collecte de donn\u00e9es plus pr\u00e9cise et moins risqu\u00e9e.<\/p>\n<p>Ce m\u00e9canisme est utilis\u00e9 pour les threads ex\u00e9cutant une m\u00e9thode Java, pour les threads ex\u00e9cutant une m\u00e9thode native, l&rsquo;\u00e9tat du thread est connu et ne change pas pendant la dur\u00e9e de la m\u00e9thode, JFR peut alors parcourir la stack du thread sans attendre un safepoint.<\/p>\n<p>Malgr\u00e9 cela, il reste un probl\u00e8me. Parfois, \u00e0 la reconstruction de la stack au safepoint, JFR ne peut pas r\u00e9soudre la stack avec les informations n\u00e9cessaires, utilisant alors par d\u00e9faut les informations du thread au safepoint, cr\u00e9ant a nouveau un biais.<\/p>\n<p>Pour aller plus loin, vous pouvez lire cet article fort int\u00e9ressant de Johannes Bechberger <a href=\"https:\/\/mostlynerdless.de\/blog\/2025\/05\/20\/taming-the-bias-unbiased-safepoint-based-stack-walking-in-jfr\/\" rel=\"noopener\" target=\"_blank\">Taming the Bias: Unbiased* Safepoint-Based Stack Walking in JFR<\/a>.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/518\" title=\"JEP 518\" rel=\"noopener\" target=\"_blank\">JEP 518<\/a>.<\/p>\n<h2>520: JFR Method Timing &amp; Tracing<\/h2>\n<p>Ajoute le tracing et le timing des m\u00e9thodes via <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/24\/docs\/api\/java.instrument\/java\/lang\/instrument\/Instrumentation.html\" rel=\"noopener\" target=\"_blank\">instrumentation de bytecode<\/a> \u00e0 Java Flight Recorder (JFR).<\/p>\n<p>Pour tracer les invocations de m\u00e9thodes (tracing) : enregistre toutes les statistiques d&rsquo;invocations au lieu du m\u00e9canisme bas\u00e9 sur du sampling.<\/p>\n<p>Pour mesurer les temps d\u2019ex\u00e9cution des m\u00e9thodes (timing) : permet la capture du temps d&rsquo;ex\u00e9cution ainsi que les stack traces de m\u00e9thodes sp\u00e9cifiques sans n\u00e9cessiter de modification de code source.<\/p>\n<p>Pour mesurer le temps d\u2019ex\u00e9cution et tracer les invocations de m\u00e9thodes, on utilise g\u00e9n\u00e9ralement lors du d\u00e9veloppement ou du d\u00e9bugging des outils tels que JMH (<a href=\"https:\/\/github.com\/openjdk\/jmh\" rel=\"noopener\" target=\"_blank\">Java Micronbenchmark Harness<\/a>), des sampling profilers  ou des agents Java. Ceux-ci ne sont pas faits pour un usage en production et ont souvent un overhead non n\u00e9gligeable.<\/p>\n<p>Avec la JEP 520, le JDK se dote d&rsquo;un outil configurable et fait pour la production pour mesurer le temps d\u2019ex\u00e9cution et tracer les invocations de m\u00e9thodes !<\/p>\n<p>Deux nouveaux \u00e9v\u00e9nements <code>jdk.MethodTiming<\/code> et <code>jdk.MethodTrace<\/code> ont \u00e9t\u00e9 ajout\u00e9s \u00e0 JFR; ils sont configurables via un filtre qui permet de pr\u00e9ciser quelles m\u00e9thodes doivent \u00eatre monitor\u00e9es.<\/p>\n<p>Par exemple, la commande suivante va activer le tracing de la m\u00e9thode <code>java.util.HashMap::resize<\/code> :<\/p>\n<pre>\njava -XX:StartFlightRecording:jdk.MethodTrace#filter=java.util.HashMap::resize,filename=recording.jfr ...\n<\/pre>\n<p>La ligne de commande suivante va activer le timing de tous les blocs d&rsquo;initialisation statique :<\/p>\n<pre>\njava -XX:StartFlightRecording:method-timing=::,filename=clinit.jfr ...\n<\/pre>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/520\" title=\"JEP 520\" rel=\"noopener\" target=\"_blank\">JEP 520<\/a>.<\/p>\n<h2>Les fonctionnalit\u00e9s qui sortent de preview<\/h2>\n<p>Les fonctionnalit\u00e9s suivantes sortent de preview (ou du module incubator) et passent en standard :<\/p>\n<ul><li><a href=\"https:\/\/openjdk.org\/jeps\/506\" rel=\"noopener\" target=\"_blank\">JEP 506<\/a> &#8211; <strong>Scoped Values<\/strong> : permettent le partage de donn\u00e9es immuables au sein et entre les threads. Un changement : <code>ScopedValue.orElse<\/code> n\u2019accepte plus null comme argument.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/511\" rel=\"noopener\" target=\"_blank\">JEP 511<\/a> &#8211; <strong>Module Import Declarations<\/strong> : permet l&rsquo;import de toutes les classes d&rsquo;un module, transitivement, via l&rsquo;instruction <code>import module java.base;<\/code>.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/512\">JEP 512<\/a> &#8211; <strong>Compact Source Files and Instance Main Methods<\/strong> : pr\u00e9c\u00e9demment nomm\u00e9e <em>Simple Source Files and Instance Main Methods<\/em>, simplifie l\u2019\u00e9criture de programmes simples en permettant de les d\u00e9finir dans une classe implicite (sans d\u00e9claration) et dans une m\u00e9thode d\u2019instance <code>void main()<\/code>. <em>Simple<\/em> Source File a \u00e9t\u00e9 renomm\u00e9 en <em>Compact<\/em> Source File, <code>java.io.IO<\/code> a \u00e9t\u00e9 d\u00e9plac\u00e9 dans le package <code>java.lang<\/code> et est donc import\u00e9 implicitement dans chaque fichier source, les m\u00e9thodes statiques de la classe <code>IO<\/code> ne sont plus import\u00e9es implicitement.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/513\" rel=\"noopener\" target=\"_blank\">JEP 513<\/a> &#8211; <strong>Flexible Constructor Bodies<\/strong> : fonctionnalit\u00e9 qui autorise des instructions <strong>avant<\/strong> l\u2019appel du constructeur parent tant que celles-ci n\u2019acc\u00e8dent pas \u00e0 l\u2019instance en cours de cr\u00e9ation.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/510\" rel=\"noopener\" target=\"_blank\">JEP 510<\/a> &#8211; <strong>Key Derivation Function API<\/strong> : nouvelle API pour les fonctions de d\u00e9rivation de cl\u00e9s (Key Derivation Function \u2013 KDF), qui sont des algorithmes cryptographiques permettant de d\u00e9river des cl\u00e9s suppl\u00e9mentaires \u00e0 partir d\u2019une cl\u00e9 secr\u00e8te et d\u2019autres donn\u00e9es.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/519\" rel=\"noopener\" target=\"_blank\">JEP 519<\/a> &#8211; <strong>Compact Object Headers<\/strong> : mode de la JVM qui r\u00e9duit de 128 \u00e0 64 bits le header des objets, fait partie du projet Liliput.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/521\" rel=\"noopener\" target=\"_blank\">JEP 521<\/a> &#8211; <strong>Generational Shenandoah<\/strong> : ajoute un mode g\u00e9n\u00e9rationnel au Garbage Collector Shenandoah.<\/li>\n<\/ul>\n<p>Pour les d\u00e9tails sur celles-ci, vous pouvez vous r\u00e9f\u00e9rer \u00e0 mes articles pr\u00e9c\u00e9dents.<\/p>\n<h2>Les fonctionnalit\u00e9s qui restent en preview<\/h2>\n<p>Les fonctionnalit\u00e9s suivantes restent en preview (ou en incubator module) :<\/p>\n<ul><li><a href=\"https:\/\/openjdk.org\/jeps\/508\" rel=\"noopener\" target=\"_blank\">JEP 508<\/a> &#8211; <strong>Vector API<\/strong> : dixi\u00e8me incubation, API permettant d\u2019exprimer des calculs vectoriels qui se compilent au moment de l\u2019ex\u00e9cution en instructions vectorielles pour les architectures CPU prises en charge. Quelques changements dans l&rsquo;API et des am\u00e9liorations de performance. Il a \u00e9t\u00e9 act\u00e9 dans la JEP que la Vector API sera en incubation tant que les fonctionnalit\u00e9s du projet Valhalla ne seront pas disponibles en preview. Ce qui \u00e9tait attendu, car la Vector API pourra alors tirer parti des am\u00e9liorations de performance et de repr\u00e9sentation en m\u00e9moire que devrait apporter le projet Valhalla.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/505\" rel=\"noopener\" target=\"_blank\">JEP 505<\/a> &#8211; <strong>Structured Concurrency<\/strong> : cinqui\u00e8me preview, nouvelle API permettant de simplifier l\u2019\u00e9criture de code multi-thread\u00e9 en permettant de traiter plusieurs t\u00e2ches concurrentes comme une unit\u00e9 de traitement unique. Il faut maintenant utiliser des m\u00e9thodes factory static pour cr\u00e9er un <code>StructuredTaskScope<\/code>.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/507\" rel=\"noopener\" target=\"_blank\">JEP 507<\/a> &#8211; <strong>Primitive Types in Patterns, instanceof, and switch<\/strong> : troisi\u00e8me preview, ajoute le support des types primitifs dans les <code>instanceof<\/code> et les <code>switch<\/code>, et enrichit le pattern matching pour supporter des patterns de types primitifs : dans les <code>instanceof<\/code>, dans les cases des <code>switch<\/code>, et dans la d\u00e9construction d\u2019un record. Aucun changement.<\/li>\n<\/ul>\n<p>Pour les d\u00e9tails sur celles-ci, vous pouvez vous r\u00e9f\u00e9rer \u00e0 mes articles pr\u00e9c\u00e9dents.<\/p>\n<h2>Divers<\/h2>\n<p>Divers ajouts au JDK :<\/p>\n<ul><li><code>ForkJoinPool<\/code> impl\u00e9mente d\u00e9sormais <code>ScheduledExecutorService<\/code><\/li>\n\n<li>ZIP <code>Deflater<\/code> et <code>Inflater<\/code> impl\u00e9mentent d\u00e9sormais <code>AutoCloseable<\/code> ce qui permet de les utiliser dans un try-with-resources.<\/li>\n\n<li><code>Currency.availableCurrencies()<\/code> : retourne une stream des monnaies disponibles.<\/li>\n\n<li><code>TimeZone.availableIDs()<\/code> : retourne une stream des identifiants de time zone disponibles.<\/li>\n\n<li><code>TimeZone.availableIDs(int offset)<\/code> : retourne une stream des identifiants de time zone disponibles pour un offset donn\u00e9.<\/li>\n\n<li><code>HttpResponse.BodyHandlers.limiting(BodyHandler, limit)<\/code> : retourne un <code>BodyHandler<\/code> qui permet de limiter la taille du corps de la r\u00e9ponse.<\/li>\n\n<li><code>HttpResponse.BodySubscribers.limiting(BodySubscriber, limit)<\/code> : retourne un <code>BodySubscriber<\/code> qui permet de limiter la taille du corps de la r\u00e9ponse.<\/li>\n\n<li><code>Math<\/code> et <code>StrictMath<\/code> : ajout de m\u00e9thodes pour la multiplication et la puissance en calcul exact (throw une exception s&rsquo;il y a un overflow) : <code>powExact()<\/code>, <code>unsignedPowExact()<\/code>, <code>unsignedMultiplyExact()<\/code>.<\/li>\n\n<li><code>CharBuffer<\/code> et <code>CharSequence.getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)<\/code> : copie les caract\u00e8res d&rsquo;une s\u00e9quence sp\u00e9cifi\u00e9e par <code>srcBegin<\/code> et <code>srcEnd<\/code> dans un tableau de caract\u00e8res donn\u00e9. Cette m\u00e9thode a \u00e9t\u00e9 impl\u00e9ment\u00e9e de mani\u00e8re performante dans certaines classes enfants et a \u00e9t\u00e9 utilis\u00e9e dans la classe <code>Reader<\/code> pour en am\u00e9liorer les performances.<\/li>\n\n<li><code>Reader.readAllAsString()<\/code> : lit tous les caract\u00e8res restants en tant que String.<\/li>\n\n<li>code&gt;Reader.readAllLines() : lit tous les caract\u00e8res restants en tant que liste de lignes de texte.<\/li>\n<\/ul>\n<p>La totalit\u00e9 des nouvelles API du JDK 25 peuvent \u00eatre trouv\u00e9es dans <a title=\"The Java Version Almanac \u2013 New APIs in Java 25\" href=\"https:\/\/javaalmanac.io\/jdk\/25\/apidiff\/24\/\" target=\"_blank\" rel=\"noopener\">The Java Version Almanac \u2013 New APIs in Java 25<\/a>.<\/p>\n<h2>Des changements internes, de la performance, et de la s\u00e9curit\u00e9<\/h2>\n<p>Comme toutes les nouvelles versions de Java, OpenJDK 25 contient son lot d&rsquo;optimisations de performance et d&rsquo;am\u00e9liorations de s\u00e9curit\u00e9.<\/p>\n<p>Pas mal de changements c\u00f4t\u00e9 JFR, une partie ont d\u00e9j\u00e0 \u00e9t\u00e9 trait\u00e9s dans cet article mais vous pourrez trouver une liste exhaustive des ces changements dans l&rsquo;article <a href=\"https:\/\/egahlin.github.io\/2025\/05\/31\/whats-new-in-jdk-25.html\" rel=\"noopener\" target=\"_blank\">What&rsquo;s new for JFR in JDK 25<\/a> d&rsquo;Erik Gahlin.<\/p>\n<p>C\u00f4t\u00e9 performance, une optimisation notable a \u00e9t\u00e9 faite pour le hashcode des Strings : il a \u00e9t\u00e9 annot\u00e9 par <a>@Stable<\/code>code&gt;@Stable&lt;\/code<\/a>, une annotation interne au JDK qui sp\u00e9cifie un champ comme ne changeant jamais apr\u00e8s que sa valeur a \u00e9t\u00e9 mise \u00e0 autre chose que le d\u00e9faut. Le JIT va alors \u00eatre capable d&rsquo;optimiser le champ (constant folding).\nDes tests ont \u00e9t\u00e9 effectu\u00e9s avec une map immuable ayant des cl\u00e9s de type String, la performance pour un lookup de cl\u00e9 a \u00e9t\u00e9 am\u00e9lior\u00e9e par 8!\nPlus d&rsquo;information dans l&rsquo;article de Per-Ake Minborg : <a href=\"https:\/\/inside.java\/2025\/05\/01\/strings-just-got-faster\/\" rel=\"noopener\" target=\"_blank\">Strings Just Got Faster<\/a>.\nVous pouvez trouver plus de d\u00e9tails sur les optimisations de performance de java 25 dans l&rsquo;article de Claes Redestad et Per-Ake Minborg <a href=\"https:\/\/inside.java\/2025\/10\/20\/jdk-25-performance-improvements\/\" rel=\"noopener\" target=\"_blank\">Performance Improvements in JDK 25<\/a>.<\/p>\n<p>Niveau s\u00e9curit\u00e9, en plus des JEP d\u00e9crites plus haut les nouveaux algorithmes de Message Digest SHAKE128-256 et SHAKE256-512  ont \u00e9t\u00e9 ajout\u00e9s ainsi que le support des algorithmes de Key Derivation Function HKDF-SHA256, HKDF-SHA384 et HKDF-SHA512 Algorithms du standard PKCS#11.\nVous pouvez vous r\u00e9f\u00e9rer \u00e0 l\u2019article de Sean Mullan pour une liste exhaustive des changements de s\u00e9curit\u00e9 inclus dans cette version : <a href=\"https:\/\/seanjmullan.org\/blog\/2025\/09\/23\/jdk25\" rel=\"noopener\" target=\"_blank\">JDK 25 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>MethodTiming<\/code> : se r\u00e9f\u00e9rer \u00e0 la section sur la JEP 520.<\/li>\n\n<li><code>MethodTrace<\/code> : se r\u00e9f\u00e9rer \u00e0 la section sur la JEP 520.<\/li>\n\n<li><code>CPUTimeSample<\/code> : se r\u00e9f\u00e9rer \u00e0 la section sur la JEP 509.<\/li>\n\n<li><code>CPUTimeSamplesLost<\/code> : se r\u00e9f\u00e9rer \u00e0 la section sur la JEP 509.<\/li>\n\n<li><code>SafepointLatency<\/code> : d\u00e9lai pour qu&rsquo;un thread atteigne un safepoint apr\u00e8s une demande.<\/li>\n\n<li><code>JavaMonitorNotify<\/code> : notify sur un monitor Java.<\/li>\n\n<li><code>JavaMonitorDeflate<\/code> : pas de description.<\/li>\n\n<li><code>JavaMonitorStatistics<\/code> : pas de description.<\/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\/25.html\" target=\"_blank\" rel=\"noopener\">JFR Events<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Au final, c&rsquo;est une release de Java assez sympa, les additions \u00e0 JFR sont cons\u00e9quentes et en font un couteau suisse du monitoring de nos applications Java. J&rsquo;aime tout particuli\u00e8rement la nouvelle API StableValue qui apporte simplicit\u00e9 et performance, ainsi que le support des textes PEM qui \u00e9tait un manque criant au JDK.<\/p>\n<p>Comme toujours, on se languit du projet Valhalla&#8230;<\/p>\n<p>Pour retrouver tous les changements de Java 25, se r\u00e9f\u00e9rer aux <a href=\"https:\/\/jdk.java.net\/25\/release-notes\" rel=\"noopener\" target=\"_blank\">release notes<\/a>.<\/p>\n<p>Si vous voulez savoir ce qu&rsquo;il y a de neuf dans Java 26 c&rsquo;est par <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-26-quoi-de-neuf\/\">ici<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 25 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 24, Java 23, Java 22, Java 21, Java 20, Java 19, Java 18, Java 17, Java 16, Java 15, Java 14,&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-25-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":"federated","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,229,163],"class_list":["post-1946","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java25","tag-whatsnew"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":829,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-11-quoi-de-neuf\/","url_meta":{"origin":1946,"position":0},"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":1946,"position":1},"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":1946,"position":2},"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":856,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-next\/","url_meta":{"origin":1946,"position":3},"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":1375,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-18-quoi-de-neuf\/","url_meta":{"origin":1946,"position":4},"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":1839,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-vers-une-integrite-par-defaut-de-la-jvm\/","url_meta":{"origin":1946,"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\/1946","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=1946"}],"version-history":[{"count":36,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1946\/revisions"}],"predecessor-version":[{"id":2119,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1946\/revisions\/2119"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}