{"id":739,"date":"2018-01-26T11:13:31","date_gmt":"2018-01-26T09:13:31","guid":{"rendered":"http:\/\/www.loicmathieu.fr\/wordpress\/?p=739"},"modified":"2018-01-26T11:13:31","modified_gmt":"2018-01-26T09:13:31","slug":"les-optimisations-de-performances-de-java-9","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/les-optimisations-de-performances-de-java-9\/","title":{"rendered":"Les optimisations de performances de Java 9"},"content":{"rendered":"<p>Dans un pr\u00e9c\u00e9dent article sur Java 9, j&rsquo;avais parcouru les principales nouveaut\u00e9s \u00e0 destination des d\u00e9veloppeurs : <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\"><a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\">http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs<\/a><\/a>.<\/p>\n<p>Je vais ici parcourir les principales nouveaut\u00e9s ax\u00e9es sur la performance<\/p>\n<p>Je vais encore reprendre les principales JEP :<\/p>\n<h2>JEP 143: Improve Contended Locking<\/h2>\n<p>Optimisation des monitors Java (optimisation des locks) en cas de contention (quand plusieurs threads acc\u00e8dent au m\u00eame monitor). Ce sont des changements au sein de la JVM qui permettent des gains de performances significatifs (x2) sur certaines op\u00e9rations de la JVM sur les primitives de lock des objets (synchronize, wait, &#8230;)<\/p>\n<p>Plus d&rsquo;info dans la pr\u00e9sentation de Monica Beckwith sur le sujet :<\/p>\n<p><a href=\"https:\/\/www.slideshare.net\/MonicaBeckwith\/jfokus-java-9-contended-locking-performance\"><a href=\"https:\/\/www.slideshare.net\/MonicaBeckwith\/jfokus-java-9-contended-locking-performance\">https:\/\/www.slideshare.net\/MonicaBeckwith\/jfokus-java-9-contended-locking-performance<\/a><\/a><\/p>\n<h2>JEP 193: Variable Handles<\/h2>\n<p>Une nouvelle API de Java, \u00e0 destination des utilisateurs avanc\u00e9s, permettant de <strong>remplacer l&rsquo;usage d&rsquo;Unsafe<\/strong> pour l&rsquo;acc\u00e8s performant \u00e0 des variables de mani\u00e8re atomique.<\/p>\n<blockquote>A variable handle is a typed reference to a variable, which supports read and write access to the variable under a variety of access modes. Supported variable kinds include instance fields, static fields and array elements.<\/blockquote>\n<p>Plus d&rsquo;info dans la description de la JEP :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/193\"><a href=\"http:\/\/openjdk.java.net\/jeps\/193\">http:\/\/openjdk.java.net\/jeps\/193<\/a><\/a><\/p>\n<h2>JEP 197: Segmented Code Cache<\/h2>\n<p>Le code cache (une partie du Metaspace) a \u00e9t\u00e9 s\u00e9par\u00e9 par type de code (m\u00e9thode, non-m\u00e9thode, profil\u00e9, non-profil\u00e9, &#8230;) pour en optimiser les performances et permettre de futures optimisations.<\/p>\n<p>Plus d&rsquo;info dans la description de la JEP :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/197\"><a href=\"http:\/\/openjdk.java.net\/jeps\/197\">http:\/\/openjdk.java.net\/jeps\/197<\/a><\/a><\/p>\n<h2>JEP 254: Compact Strings<\/h2>\n<p>C&rsquo;est une des principales JEP autour de la performance!<\/p>\n<p>L\u2019impl\u00e9mentation des String en Java a \u00e9t\u00e9 revue pour en proposer une version plus compacte.<\/p>\n<p>Jusqu&rsquo;ici les String \u00e9taient stock\u00e9es en UTF-16, chaque caract\u00e8re prenait donc deux octets car stock\u00e9s dans un tableau de char.<\/p>\n<p>Avec les Compact String, a la construction de la String, si elle est compatible ISO-8859-1 (ou Latin-1), chaque caract\u00e8re sera alors stock\u00e9 dans un seul octet, le stockage d&rsquo;une String passant alors d&rsquo;un tableau de char \u00e0 un tableau de byte. Le gain potentiel est \u00e9norme : diminution de presque 50% de la taille n\u00e9cessaire pour stocker les String. Les String sont la principale source d&rsquo;utilisation de la m\u00e9moire et bien souvent elles sont compatible ISO-8859-1.<\/p>\n<p>Si la String est non compatible ISO-8859-1, alors les caract\u00e8res seront quand m\u00eames stock\u00e9s dans un tableau de byte mais il faudra deux bytes pour chaque caract\u00e8re. Un flag ayant \u00e9tait ajout\u00e9 \u00e0 la classe String pour connaitre l&rsquo;encoding de celle-ci.<\/p>\n<p>Ce changement a \u00e9t\u00e9 fait sans aucun changement dans l&rsquo;API publique java : en utilisant Java 9, on utilise directement les Compact Strings! StringBuilder\/Buffer ont aussi \u00e9tait mis \u00e0 jour pour en tirer parti.<\/p>\n<p>Lors des tests pr\u00e9liminaires \u00e0 l&rsquo;impl\u00e9mentation de cette JEP, les gains suivants ont \u00e9t\u00e9 avanc\u00e9s (voir&nbsp;<a href=\"http:\/\/cr.openjdk.java.net\/~shade\/density\/state-of-string-density-v1.tx\"><a href=\"http:\/\/cr.openjdk.java.net\/~shade\/density\/state-of-string-density-v1.tx\">http:\/\/cr.openjdk.java.net\/~shade\/density\/state-of-string-density-v1.tx<\/a><\/a>t) :<\/p>\n<ul><li>Gain de 5% \u00e0 15% de la taille de la heap (25% des objets sont des String)<\/li>\n\n<li>Gain de performance de 20% pour Latin-1 compar\u00e9 \u00e0 UTF-16 (30% de garbage en moins) : microbenchmark d&rsquo;instanciation\/concat\u00e9nation de String<\/li>\n<\/ul>\n<p>De plus, ce changement ouvre la porte \u00e0 de nombreuses optimisations dans le code de Java et de la JVM (entre autre, encoder\/d\u00e9coder des String en ISO-8859-1 ou UTF-8 si compatible).<\/p>\n<p>Plus d&rsquo;info dans la JEP :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/254\"><a href=\"http:\/\/openjdk.java.net\/jeps\/254\">http:\/\/openjdk.java.net\/jeps\/254<\/a><\/a><\/p>\n<h2>JEP 274: Enhanced Method Handles<\/h2>\n<p>Plusieurs ajout \u00e0 l\u2019API MethodHandle permettant de cr\u00e9er de nouvelles optimisations au compilateur.<\/p>\n<p>Plus d&rsquo;info dans la description de la JEP :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/274\"><a href=\"http:\/\/openjdk.java.net\/jeps\/274\">http:\/\/openjdk.java.net\/jeps\/274<\/a><\/a><\/p>\n<h2>JEP 280: Indify String Concatenation<\/h2>\n<p>C&rsquo;est une des principales JEP autour de la performance!<\/p>\n<p>Apr\u00e8s la compaction des String, en voici la concatenation am\u00e9lior\u00e9!<\/p>\n<p>Quelques explications tous d&rsquo;abord.<\/p>\n<p>Quand on concat\u00e8ne des cha\u00eenes de caract\u00e8res en java, on cr\u00e9\u00e9 beaucoup d&rsquo;objets \u00e9ph\u00e9m\u00e8res qui seront ensuite collect\u00e9s par la Garbage Collector (GC) :<\/p>\n<p><code>String s = &quot;toto&quot; + &quot;tata&quot; + &quot;titi&quot; + &quot;tutu&quot;;<\/code><\/p>\n<p>Entra\u00eene la cr\u00e9ation de 6 String car les String sont immuable : s, \u00ab\u00a0toto\u00a0\u00bb, \u00ab\u00a0tata\u00a0\u00bb, \u00ab\u00a0titi\u00a0\u00bb,\u00a0\u00bbtototata\u00a0\u00bb, \u00ab\u00a0tototatatiti\u00a0\u00bb, \u00ab\u00a0tototatatititutu\u00a0\u00bb &#8230; pour finir par ne garder que <strong>s<\/strong> et donc les autres objets seront \u00e0 nettoyer par le GC.<\/p>\n<p>Depuis Java 6, le compilateur Java (javac) essaye d&rsquo;optimiser \u00e7a en rempla\u00e7ant, lors de la compilation, les concat\u00e9nations par l&rsquo;usage de StringBuilder. Il remplace donc le code pr\u00e9c\u00e9dent par<\/p>\n<p><code>String s = new StringBuilder(&quot;toto&quot;).append(&quot;tata&quot;).append(&quot;titi&quot;).append(&quot;tutu&quot;).toString();<\/code><\/p>\n<p>Cette optimisation, bien qu&rsquo;efficace, a quelques limites, entre autre elle d\u00e9pend de la capacit\u00e9 du compilateur \u00e0 d\u00e9tecter la concat\u00e9nation de String. De plus le Just In Time Compiler de Java (JIT) optimise aussi ces concat\u00e9nation de cha\u00eene \u00e0 plusieurs niveau.<\/p>\n<p>La JEP 280 remplace cel\u00e0 par l&rsquo;utilisation du bytecode InvodeDynamic lors de la concat\u00e9nation de String et l&rsquo;impl\u00e9mentation au runtime d&rsquo;une strat\u00e9gie de concat\u00e9nation optimis\u00e9e directement au sein de la JVM (intrinsifi\u00e9e donc). Plusieurs strat\u00e9gies de concat\u00e9nation de cha\u00eenes ont \u00e9t\u00e9 cod\u00e9es dont une \u00e0 base de MethodHandles (avec StringBuilder ou en inline), c\u2019est celle par d\u00e9faut dor\u00e9navant.<\/p>\n<p>Les tests lors du d\u00e9veloppement ont mont\u00e9 que (voir <a href=\"http:\/\/cr.openjdk.java.net\/~shade\/8085796\/notes.txt\"><a href=\"http:\/\/cr.openjdk.java.net\/~shade\/8085796\/notes.txt\">http:\/\/cr.openjdk.java.net\/~shade\/8085796\/notes.txt<\/a><\/a>):<\/p>\n<ul><li>Les performances lorsque le code est compil\u00e9 par C2 (le dernier niveau du JIT) sont identiques<\/li>\n\n<li>Les performances lorsque le code est uniquement compil\u00e9 par C1 (le premier niveau du JIT) sont meilleurs<\/li>\n\n<li>Les performances lorsque C1\/C2 n&rsquo;arrivent pas \u00e0 optimiser les concat\u00e9nations sont largement meilleurs !<\/li>\n<\/ul>\n<p>En conclusion : pas de r\u00e9gression de performance, meilleurs performances au d\u00e9marrage (quand le code est non compil\u00e9 ou uniquement par C1), meilleurs performances quand javac ou C1\/C2 n&rsquo;arrivent pas \u00e0 optimiser le code!<\/p>\n<p>Plus d&rsquo;info dans les d\u00e9tails de la JEP :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/280\"><a href=\"http:\/\/openjdk.java.net\/jeps\/280\">http:\/\/openjdk.java.net\/jeps\/280<\/a><\/a><\/p>\n<h2>JEP 285: Spin-Wait Hints<\/h2>\n<p>Une nouvelle m\u00e9thode dans la classe Thread permet de notifier la JVM qu&rsquo;on est dans une spin-wait loop. Libre \u00e0 la JVM de faire ou ne pas faire quelque chose (cette m\u00e9thode est native). Une spin-wait loop est une boucle dans laquelle le thread en question ne peut pas avancer car en attente d&rsquo;un \u00e9v\u00e9nement externe (busy wait).<\/p>\n<p>Voici un exemple tir\u00e9 de la JavaDoc<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nclass EventHandler {\n  volatile boolean eventNotificationNotReceived;\n\n  void waitForEventAndHandleIt() {\n    while ( eventNotificationNotReceived ) {\n      java.lang.Thread.onSpinWait();\n    }\n  readAndProcessEvent();\n}\n\n  void readAndProcessEvent() {\n    \/\/ Read event from some source and process it\n    . . .\n  }\n}\n<\/pre>\n<p>Plus d&rsquo;info dans la description de la JEP :&nbsp;<a href=\"http:\/\/openjdk.java.net\/jeps\/285\"><a href=\"http:\/\/openjdk.java.net\/jeps\/285\">http:\/\/openjdk.java.net\/jeps\/285<\/a><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Dans un pr\u00e9c\u00e9dent article sur Java 9, j&rsquo;avais parcouru les principales nouveaut\u00e9s \u00e0 destination des d\u00e9veloppeurs : <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\">http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs<\/a>. Je vais ici parcourir les principales nouveaut\u00e9s ax\u00e9es sur la performance Je vais encore reprendre les principales JEP : JEP 143: Improve Contended Locking Optimisation des monitors Java (optimisation des locks) en cas de contention (quand plusieurs threads acc\u00e8dent au m\u00eame monitor). Ce sont des changements au sein de la JVM qui permettent des gains de performances significatifs (x2) sur certaines op\u00e9rations&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/les-optimisations-de-performances-de-java-9\/\">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,158,159],"class_list":["post-739","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java9","tag-performance"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":722,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-10-quoi-de-neuf\/","url_meta":{"origin":739,"position":0},"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":739,"position":1},"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":652,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\/","url_meta":{"origin":739,"position":2},"title":"Les nouveaut\u00e9s de java 9 pour les d\u00e9veloppeurs","author":"admin","date":"lundi 27 mars 2017","format":false,"excerpt":"Maintenant que Java 9 est Features Complete, il est temps de se pencher sur toutes les nouveaut\u00e9s que cette nouvelle version va nous apporter, \u00e0 nous, d\u00e9velopeurs utilisant java. Bien sur, tout le monde a entendu parler de la modularisation du JDK (project Jigsaw) attendu depuis tr\u00e8s longtemps. Et bien,\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"jshell the Java REPL","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/jshell.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":947,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-13-quoi-de-neuf\/","url_meta":{"origin":739,"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":1877,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-24-quoi-de-neuf\/","url_meta":{"origin":739,"position":4},"title":"Java 24 : quoi de neuf ?","author":"admin","date":"vendredi 10 janvier 2025","format":false,"excerpt":"Maintenant que Java 24 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":865,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-12-quoi-de-neuf\/","url_meta":{"origin":739,"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\/739","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=739"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/739\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}