{"id":203,"date":"2008-01-26T10:51:08","date_gmt":"2008-01-26T10:51:08","guid":{"rendered":"https:\/\/kari.world.ikari.fi\/2008\/01\/26\/did-escape-analysis-escape-from-java-6\/"},"modified":"2008-01-26T10:51:08","modified_gmt":"2008-01-26T10:51:08","slug":"did-escape-analysis-escape-from-java-6","status":"publish","type":"post","link":"https:\/\/kari.world.ikari.fi\/?p=203","title":{"rendered":"Did escape analysis escape from Java 6?"},"content":{"rendered":"<p>Short summary:<br \/>\nEscape analysis is not enabled by default in JDK 6, and it&#8217;s available only in server JVM<\/p>\n<p>Thus in order to enable Escape analysis, following parameters for java are required:<br \/>\n[code]<br \/>\njava -server -XX:+DoEscapeAnalysis<br \/>\n[\/code]<\/p>\n<p>So lets run run the test from the references&#8230;<\/p>\n<p><b>Test Program<\/b><br \/>\n[code lang=&#8221;java&#8221;]<br \/>\npackage org.kari.test;<\/p>\n<p>public class LockTest {<br \/>\n    \/\/ 20 million .<br \/>\n    private static final int MAX = 20000000;<\/p>\n<p>    public static void main(String[] args)<br \/>\n        throws InterruptedException<br \/>\n    {<br \/>\n        \/\/ warm up the method cache<br \/>\n        concatBuffer(&#8221;Josh&#8221;, &#8221;James&#8221;, &#8221;Duke&#8221;);<br \/>\n        concatBuilder(&#8221;Josh&#8221;, &#8221;James&#8221;, &#8221;Duke&#8221;);<\/p>\n<p>        System.gc();<br \/>\n        Thread.sleep(1000);<br \/>\n        long start = System.currentTimeMillis();<br \/>\n        for (int i = 0; i < MAX; i++) {\n            concatBuffer(\"Josh\", \"James\", \"Duke\");\n        }\n\n        long bufferCost = System.currentTimeMillis() - start;\n        System.out.println(\"StringBuffer: \" + bufferCost + \" ms.\");\n\n        System.gc();\n        Thread.sleep(1000);\n        start = System.currentTimeMillis();\n        for (int i = 0; i < MAX; i++) {\n            concatBuilder(\"Josh\", \"James\", \"Duke\");\n        }\n        long builderCost = System.currentTimeMillis() - start;\n        System.out.println(\"StringBuilder: \" + builderCost + \" ms.\");\n        System.out.println(\"Thread safety overhead of StringBuffer: \"\n                + ((bufferCost * 10000 \/ (builderCost * 100)) - 100) + \"%n\");\n    }\n\n    public static String concatBuffer(String s1, String s2, String s3) {\n        StringBuffer sb = new StringBuffer();\n        sb.append(s1);\n        sb.append(s2);\n        sb.append(s3);\n        return sb.toString();\n    }\n\n    public static String concatBuilder(String s1, String s2, String s3) {\n        StringBuilder sb = new StringBuilder();\n        sb.append(s1);\n        sb.append(s2);\n        sb.append(s3);\n        return sb.toString();\n    }\n}\n[\/code]\n\n<b>Test script:<\/b><br \/>\n[code]<br \/>\nCP=&#8221;-cp bin&#8221;<br \/>\nMAIN=&#8221;org.kari.test.LockTest&#8221;<br \/>\n# 1<br \/>\nARGS=&#8221;-server -XX:-DoEscapeAnalysis -XX:-EliminateLocks -XX:-UseBiasedLocking&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<\/p>\n<p># 2<br \/>\nARGS=&#8221;-server -XX:+DoEscapeAnalysis -XX:-EliminateLocks -XX:-UseBiasedLocking&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<\/p>\n<p># 3<br \/>\nARGS=&#8221;-server -XX:-DoEscapeAnalysis -XX:+EliminateLocks -XX:-UseBiasedLocking&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<\/p>\n<p># 4<br \/>\nARGS=&#8221;-server -XX:-DoEscapeAnalysis -XX:-EliminateLocks -XX:+UseBiasedLocking&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<\/p>\n<p># 5<br \/>\nARGS=&#8221;-server -XX:-DoEscapeAnalysis -XX:+EliminateLocks -XX:+UseBiasedLocking&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<\/p>\n<p># 6<br \/>\nARGS=&#8221;-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks -XX:+UseBiasedLocking&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<\/p>\n<p># 7<br \/>\nARGS=&#8221;-server&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<\/p>\n<p># 8<br \/>\nARGS=&#8221;-client&#8221;<br \/>\necho &#8221;&#8221;<br \/>\necho &#8221;TEST: $ARGS&#8221;<br \/>\njava $CP $ARGS $MAIN<br \/>\n[\/code]<\/p>\n<p><b>Results<\/b><br \/>\n[code]<br \/>\nPicked up _JAVA_OPTIONS: -Xverify:none -Dsun.java2d.opengl=true<br \/>\nStringBuffer: 4854 ms.<br \/>\nStringBuilder: 3905 ms.<br \/>\nThread safety overhead of StringBuffer: 24%n<\/p>\n<p>TEST: -server -XX:+DoEscapeAnalysis -XX:-EliminateLocks -XX:-UseBiasedLocking<br \/>\nStringBuffer: 4850 ms.<br \/>\nStringBuilder: 4222 ms.<br \/>\nThread safety overhead of StringBuffer: 14%n<\/p>\n<p>TEST: -server -XX:-DoEscapeAnalysis -XX:+EliminateLocks -XX:-UseBiasedLocking<br \/>\nStringBuffer: 4598 ms.<br \/>\nStringBuilder: 4509 ms.<br \/>\nThread safety overhead of StringBuffer: 1%n<\/p>\n<p>TEST: -server -XX:-DoEscapeAnalysis -XX:-EliminateLocks -XX:+UseBiasedLocking<br \/>\nStringBuffer: 4679 ms.<br \/>\nStringBuilder: 3940 ms.<br \/>\nThread safety overhead of StringBuffer: 18%n<\/p>\n<p>TEST: -server -XX:-DoEscapeAnalysis -XX:+EliminateLocks -XX:+UseBiasedLocking<br \/>\nStringBuffer: 4835 ms.<br \/>\nStringBuilder: 4268 ms.<br \/>\nThread safety overhead of StringBuffer: 13%n<\/p>\n<p>TEST: -server -XX:+DoEscapeAnalysis -XX:+EliminateLocks -XX:+UseBiasedLocking<br \/>\nStringBuffer: 4989 ms.<br \/>\nStringBuilder: 4397 ms.<br \/>\nThread safety overhead of StringBuffer: 13%n<\/p>\n<p>TEST: -server<br \/>\nStringBuffer: 4389 ms.<br \/>\nStringBuilder: 3969 ms.<br \/>\nThread safety overhead of StringBuffer: 10%n<\/p>\n<p>TEST: -client<br \/>\nStringBuffer: 6441 ms.<br \/>\nStringBuilder: 5690 ms.<br \/>\nThread safety overhead of StringBuffer: 13%n<br \/>\n[\/code]<\/p>\n<p><b>NOTE:<\/b> I&#8217;ve following global java options in use in my system<br \/>\n[code]<br \/>\nexport _JAVA_OPTIONS=&#8221;-Xverify:none -Dsun.java2d.opengl=true&#8221;<br \/>\n[\/code]<\/p>\n<p><b>References:<\/b><br \/>\n<a href=\"http:\/\/www.urlfan.com\/local\/did_escape_analysis_escape_from_java_6\/59149372.html\">Did escape analysis escape from Java 6?<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Short summary: Escape analysis is not enabled by default in JDK 6, and it&#8217;s available only in server JVM Thus in order to enable Escape analysis, following parameters for java are required: [code] java -server -XX:+DoEscapeAnalysis [\/code] So lets run run the test from the references&#8230; Test Program [code lang=&#8221;java&#8221;] package org.kari.test; public class LockTest&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-203","post","type-post","status-publish","format-standard","hentry","category-java"],"_links":{"self":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts\/203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=203"}],"version-history":[{"count":0,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts\/203\/revisions"}],"wp:attachment":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}