{"id":66345,"date":"2022-08-10T09:01:22","date_gmt":"2022-08-10T09:01:22","guid":{"rendered":"https:\/\/www.cryptocabaret.com\/?p=66345"},"modified":"2022-08-10T09:01:22","modified_gmt":"2022-08-10T09:01:22","slug":"a-guide-to-jvm-interpretation-and-compilation","status":"publish","type":"post","link":"https:\/\/www.cryptocabaret.com\/?p=66345","title":{"rendered":"A guide to JVM interpretation and compilation"},"content":{"rendered":"<p><span class=\"field field--name-title field--type-string field--label-hidden\">A guide to JVM interpretation and compilation<\/span><br \/>\n<span class=\"field field--name-uid field--type-entity-reference field--label-hidden\"><a title=\"View user profile.\" href=\"https:\/\/opensource.com\/users\/jayashree-huttanagoudar\" class=\"username\">Jayashree Hutt\u2026<\/a><\/span><br \/>\n<span class=\"field field--name-created field--type-created field--label-hidden\">Tue, 08\/09\/2022 &#8211; 10:36<\/span><\/p>\n<div data-drupal-selector=\"rate-node-70138\" class=\"rate-widget-thumbs-up\" title=\"Register or Login to like.\">\n<div class=\"rate-thumbs-up-btn-up vote-pending\"><a href=\"https:\/\/opensource.com\/user\/register\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml\">Login<\/a> to like<\/div>\n<div class=\"rate-score\"><a href=\"https:\/\/opensource.com\/user\/register\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml\">Login<\/a> to like<\/div>\n<\/div>\n<div class=\"clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item\">\n<p>Java is a platform-independent language. Programs are converted to <em>bytecode<\/em> after compilation. This bytecode gets converted to <em>machine code<\/em> at runtime. An interpreter emulates the execution of bytecode instructions for the abstract machine on a specific physical machine. Just-in-time (JIT) compilation happens at some point during execution, and ahead-of-time (AOT) compilation happens during build time.\u00a0<\/p>\n<p>This article explains when an interpreter comes into play and when JIT and AOT will occur. I also discuss the trade-offs between JIT and AOT.<\/p>\n<h2>Source code, bytecode, machine code<\/h2>\n<p>Applications are generally written using a programming language like C, C++, or Java. The set of instructions written using high-level programming languages is called source code. Source code is human readable. To execute it on the target machine, source code needs to be converted to machine code, which is machine readable. Source code is typically converted into machine code by a compiler.\u00a0<\/p>\n<p>In Java, however, the source code is first converted into an intermediate form called <em>bytecode<\/em>. This bytecode is platform independent, which is why Java is well known as a platform-independent programming language. The primary Java compiler <code>javac<\/code> converts the Java source code into bytecode. Then, the bytecode is interpreted by the interpreter.<\/p>\n<p>Here is a small <code>Hello.java<\/code> program:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\"><span class=\"co1\">\/\/Hello.java<\/span><br><span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> Hello <span class=\"br0\">{<\/span><br><br>\n\u00a0 \u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> main<span class=\"br0\">(<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> args<span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"Inside Hello World!\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"br0\">}<\/span><br><span class=\"br0\">}<\/span><\/div><\/div><\/pre>\n<p>Compile it using <code>javac<\/code> to generate a <code>Hello.class<\/code> file containing the bytecode.\u00a0<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ javac Hello.<span class=\"me1\">java<\/span><br>\n$ ls<br>\nHello.<span class=\"kw1\">class<\/span> \u00a0Hello.<span class=\"me1\">java<\/span><\/div><\/div><\/pre>\n<p>Now, use <code>javap<\/code> to disassemble the content of the <code>Hello.class<\/code> file. The output of <code>javap<\/code> depends on the options used. If you don&#8217;t choose any options, it prints basic information, including which source file this class file is compiled from, the package name, public and protected fields, and methods of the class.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ javap Hello.<span class=\"kw1\">class<\/span><br>\nCompiled from <span class=\"st0\">\"Hello.java\"<\/span><br><span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> Hello <span class=\"br0\">{<\/span><br>\n\u00a0 <span class=\"kw1\">public<\/span> Hello<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> main<span class=\"br0\">(<\/span>java.<span class=\"me1\">lang<\/span>.<a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br><span class=\"br0\">}<\/span><\/div><\/div><\/pre>\n<p>To see the bytecode content in the <code>.class<\/code> file, use the <code>-c<\/code> option:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">$ javap <span class=\"re5\">-c<\/span> Hello.class<br>\nCompiled from <span class=\"st0\">\"Hello.java\"<\/span><br>\npublic class Hello <span class=\"br0\">{<\/span><br>\n\u00a0 public Hello<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>;<br>\n\u00a0 \u00a0 \u00a0 \u00a0 Code:<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">0<\/span>: aload_0<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span>: invokespecial <span class=\"co0\">#1 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Method java\/lang\/Object.\"<init>\":()V<\/init><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">4<\/span>: <span class=\"kw3\">return<\/span><br><br>\n\u00a0 public static void main<span class=\"br0\">(<\/span>java.lang.String<span class=\"br0\">[<\/span><span class=\"br0\">]<\/span><span class=\"br0\">)<\/span>;<br>\n\u00a0 \u00a0 \u00a0 \u00a0 Code:<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">0<\/span>: getstatic \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"co0\">#2 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Field java\/lang\/System.out:Ljava\/io\/PrintStream;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">3<\/span>: ldc \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"co0\">#3 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ String Inside Hello World!<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">5<\/span>: invokevirtual <span class=\"co0\">#4 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Method \u00a0 \u00a0<\/span><br>\njava<span class=\"sy0\">\/<\/span>io<span class=\"sy0\">\/<\/span>PrintStream.println:<span class=\"br0\">(<\/span>Ljava<span class=\"sy0\">\/<\/span>lang<span class=\"sy0\">\/<\/span>String;<span class=\"br0\">)<\/span>V<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">8<\/span>: <span class=\"kw3\">return<\/span><br><span class=\"br0\">}<\/span><\/div><\/div><\/pre>\n<p>To get more detailed information, use the <code>-v<\/code> option:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"java geshifilter-java\">$ javap <span class=\"sy0\">-<\/span>v Hello.<span class=\"kw1\">class<\/span><\/code><\/span><\/pre>\n<h2>Interpreter, JIT, AOT<\/h2>\n<p>The interpreter is responsible for emulating the execution of bytecode instructions for the abstract machine on a specific physical machine. When compiling source code using <code>javac\u00a0<\/code>and executing using the <code>java<\/code> command, the interpreter operates during runtime and serves its purpose.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ javac Hello.<span class=\"me1\">java<\/span><br>\n$ java Hello<br>\nInside Hello World<span class=\"sy0\">!<\/span><\/div><\/div><\/pre>\n<p>The JIT compiler also operates at runtime. When the interpreter interprets a Java program, another component, called a runtime profiler, is silently monitoring the program&#8217;s execution to observe which portion of the code is getting interpreted and how many times. These statistics help detect the <em>hotspots<\/em> of the program, that is, those portions of code frequently being interpreted. Once they&#8217;re interpreted above a set threshold, they are eligible to be converted into machine code directly by the JIT compiler. The JIT compiler is also known as a profile-guided compiler. Conversion of bytecode to native code happens on the fly, hence the name just-in-time. JIT reduces overhead of the interpreter emulating the same set of instructions to machine code.<\/p>\n<p>The AOT compiler compiles code during build time. Generating frequently interpreted and JIT-compiled code at build time improves the warm-up time of the Java Virtual Machine (JVM). This compiler was introduced in Java 9 as an experimental feature. The <code>jaotc<\/code> tool uses the Graal compiler, which is itself written in Java, for AOT compilation.\u00a0<\/p>\n<p>Here&#8217;s a sample use case for a Hello program:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\"><span class=\"co1\">\/\/Hello.java<\/span><br><span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> Hello <span class=\"br0\">{<\/span><br><br><br>\n\u00a0 \u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> main<span class=\"br0\">(<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> args<span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"Inside Hello World!\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"br0\">}<\/span><br><span class=\"br0\">}<\/span><br><br><br>\n$ javac Hello.<span class=\"me1\">java<\/span><br>\n$ jaotc <span class=\"sy0\">--<\/span>output libHello.<span class=\"me1\">so<\/span> Hello.<span class=\"kw1\">class<\/span><br>\n$ java <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>UnlockExperimentalVMOptions <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>AOTLibrary<span class=\"sy0\">=<\/span>.<span class=\"sy0\">\/<\/span>libHello.<span class=\"me1\">so<\/span> Hello<br>\nInside Hello World<span class=\"sy0\">!<\/span><\/div><\/div><\/pre>\n<h2>When do interpreting and compiling come into play: an example<\/h2>\n<p>This example illustrates when Java uses an interpreter and when JIT and AOT pitch in. Consider a simple Java program, <code>Demo.java<\/code>:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\"><span class=\"co1\">\/\/Demo.java<\/span><br><span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> Demo <span class=\"br0\">{<\/span><br>\n\u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> square<span class=\"br0\">(<\/span><span class=\"kw4\">int<\/span> i<span class=\"br0\">)<\/span> <span class=\"kw1\">throws<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw1\">return<\/span><span class=\"br0\">(<\/span>i<span class=\"sy0\">*<\/span>i<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 <span class=\"br0\">}<\/span><br><br><br>\n\u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> main<span class=\"br0\">(<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> args<span class=\"br0\">)<\/span> <span class=\"kw1\">throws<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw1\">for<\/span> <span class=\"br0\">(<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> i <span class=\"sy0\"> <span class=\"nu0\">10<\/span><span class=\"sy0\">;<\/span> i<span class=\"sy0\">++<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"call \"<\/span> <span class=\"sy0\">+<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+integer\"><span class=\"kw3\">Integer<\/span><\/a>.<span class=\"me1\">valueOf<\/span><span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw4\">long<\/span> a <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">nanoTime<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Int r <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> Demo<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>.<span class=\"me1\">square<\/span><span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"Square(i) = \"<\/span> <span class=\"sy0\">+<\/span> r<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw4\">long<\/span> b <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">nanoTime<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"elapsed= \"<\/span> <span class=\"sy0\">+<\/span> <span class=\"br0\">(<\/span>b<span class=\"sy0\">-<\/span>a<span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"--------------------------------\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"br0\">}<\/span><br>\n\u00a0 <span class=\"br0\">}<\/span><br><span class=\"br0\">}<\/span><\/span><\/div><\/div><\/pre>\n<p>This simple program has a <code>main<\/code> method that creates a <code>Demo<\/code> object instance, and calls the method <code>square<\/code>, which displays the square root of the <code>for<\/code> loop iteration value. Now, compile and run the code:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ javac Demo.<span class=\"me1\">java<\/span><br>\n$ java Demo<br><span class=\"nu0\">1<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">8432439<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">2<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">4<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">54631<\/span><br><span class=\"sy0\">--------------------------------<\/span><br>\n.<br>\n.<br>\n.<br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">66498<\/span><br><span class=\"sy0\">--------------------------------<\/span><\/div><\/div><\/pre>\n<\/p>\n<div class=\"embedded-resource-list callout-float-right\">\n<div class=\"field field--name-title field--type-string field--label-hidden field__item\">More on Java<\/div>\n<div class=\"field field--name-links field--type-link field--label-hidden field__items\">\n<div class=\"field__item\"><a href=\"https:\/\/developers.redhat.com\/topics\/enterprise-java\/?intcmp=7013a000002Cxq6AAC\">What is enterprise Java programming?<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/developers.redhat.com\/products\/openjdk\/overview?intcmp=7013a000002Cxq6AAC\">Red Hat build of OpenJDK<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/downloads\/java-cheat-sheet?intcmp=7013a000002Cxq6AAC\">Java cheat sheet<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/www.redhat.com\/en\/services\/training\/do092-developing-cloud-native-applications-microservices-architectures?intcmp=7013a000002Cxq6AAC\">Free online course: Developing cloud-native applications with microservices<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/tags\/java?intcmp=7013a000002Cxq6AAC\">Fresh Java articles<\/a><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>The question now is whether the output is a result of the interpreter, JIT, or AOT. In this case, it&#8217;s wholly interpreted. How did I conclude that? Well, to get JIT to contribute to the compilation, the hotspots of the code must be interpreted above a defined threshold. Then and only then are those pieces of code queued for JIT compilation. To find the threshold for JDK 11:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintFlagsFinal <span class=\"sy0\">-<\/span>version <span class=\"sy0\">|<\/span> grep CompileThreshold<br>\n\u00a0intx CompileThreshold \u00a0 \u00a0 <span class=\"sy0\">=<\/span> <span class=\"nu0\">10000<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"br0\">{<\/span>pd product<span class=\"br0\">}<\/span> <span class=\"br0\">{<\/span><span class=\"kw1\">default<\/span><span class=\"br0\">}<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br>\nopenjdk version <span class=\"st0\">\"11.0.13\"<\/span> <span class=\"nu0\">2021<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">10<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">19<\/span><br>\nOpenJDK <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+runtime\"><span class=\"kw3\">Runtime<\/span><\/a> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+environment\"><span class=\"kw3\">Environment<\/span><\/a> <span class=\"nu0\">18.9<\/span> <span class=\"br0\">(<\/span>build 11.0.13<span class=\"sy0\">+<\/span><span class=\"nu0\">8<\/span><span class=\"br0\">)<\/span><br>\nOpenJDK <span class=\"nu0\">64<\/span><span class=\"sy0\">-<\/span>Bit Server VM <span class=\"nu0\">18.9<\/span> <span class=\"br0\">(<\/span>build 11.0.13<span class=\"sy0\">+<\/span><span class=\"nu0\">8<\/span>, mixed mode, sharing<span class=\"br0\">)<\/span><\/div><\/div><\/pre>\n<p>The above output demonstrates that a particular piece of code should be interpreted 10,000 times to be eligible for JIT compilation. Can this threshold be manually tuned, and is there some JVM flag that indicates whether a method is JIT compiled? Yes, there are multiple options to serve this purpose.\u00a0<\/p>\n<p>One option for learning whether a method is JIT compiled is <code>-XX:+PrintCompilation<\/code>. Along with this option, the flag <code>-Xbatch<\/code> provides the output in a more readable way. If both interpretation and JIT are happening in parallel, the <code>-Xbatch<\/code> flag helps distinguish the output of both. Use these flags as follows:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>Xbatch \u00a0<span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintCompilation \u00a0Demo<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">34<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 \u00a0b \u00a0<span class=\"nu0\">3<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">util<\/span>.<span class=\"me1\">concurrent<\/span>.<span class=\"me1\">ConcurrentHashMap<\/span><span class=\"sy0\">::<\/span>tabAt <span class=\"br0\">(<\/span><span class=\"nu0\">22<\/span> bytes<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">35<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">2<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 jdk.<span class=\"me1\">internal<\/span>.<span class=\"me1\">misc<\/span>.<span class=\"me1\">Unsafe<\/span><span class=\"sy0\">::<\/span>getObjectVolatile <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0\u00a0<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">35<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">3<\/span> \u00a0 \u00a0 \u00a0 \u00a0b \u00a0<span class=\"nu0\">3<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+object\"><span class=\"kw3\">Object<\/span><\/a><span class=\"sy0\">::init<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">(<\/span><span class=\"nu0\">1<\/span> bytes<span class=\"br0\">)<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">210<\/span> \u00a0<span class=\"nu0\">269<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">reflect<\/span>.<a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+array\"><span class=\"kw3\">Array<\/span><\/a><span class=\"sy0\">::<\/span>newArray <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">211<\/span> \u00a0<span class=\"nu0\">270<\/span> \u00a0 \u00a0 \u00a0 \u00a0b \u00a0<span class=\"nu0\">3<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"sy0\">::<\/span>substring <span class=\"br0\">(<\/span><span class=\"nu0\">58<\/span> bytes<span class=\"br0\">)<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">50150<\/span><br><span class=\"sy0\">--------------------------------<\/span>\u00a0<\/span><\/div><\/div><\/pre>\n<p>The output of the above command is too lengthy, so I&#8217;ve truncated the middle portion. Note that along with the Demo program code, the JDKs internal class functions are also getting compiled. This is why the output is so lengthy. Because my focus is <code>Demo.java<\/code> code, I&#8217;ll use an option that can minimize the output by excluding the internal package functions. The command &#8211;<code>XX:CompileCommandFile<\/code> disables JIT for internal classes:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>Xbatch <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileCommandFile<span class=\"sy0\">=<\/span>hotspot_compiler Demo<\/code><\/span><\/pre>\n<p>The file <code>hotspot_compiler<\/code> referenced by <code>-XX:CompileCommandFile<\/code> contains this code to exclude specific packages:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ cat hotspot_compiler<br>\nquiet<br>\nexclude java<span class=\"coMULTI\">\/* *<br>\nexclude jdk\/* *<br>\nexclude sun\/* *<\/span><\/div><\/div><\/pre>\n<p>In the first line, <code>quiet<\/code> instructs the JVM not to write anything about excluded classes. To tune the JIT threshold, use <code>-XX:CompileThreshold<\/code> with the value set to 5, meaning that after interpreting five times, it&#8217;s time for JIT:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>Xbatch <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileCommandFile<span class=\"sy0\">=<\/span>hotspot_compiler <br><span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileThreshold<span class=\"sy0\">=<\/span><span class=\"nu0\">5<\/span> Demo<br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">47<\/span>\u00a0 \u00a0 \u00a0 <span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToStatic<span class=\"br0\">(<\/span>LLLLLL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">47<\/span>\u00a0 \u00a0 \u00a0 <span class=\"nu0\">2<\/span> \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>invokeBasic<span class=\"br0\">(<\/span>LLLLL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">47<\/span>\u00a0 \u00a0 \u00a0 <span class=\"nu0\">3<\/span> \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToSpecial<span class=\"br0\">(<\/span>LLLLLLL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">48<\/span>\u00a0 \u00a0 \u00a0 <span class=\"nu0\">4<\/span> \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToStatic<span class=\"br0\">(<\/span>L<span class=\"br0\">)<\/span>I <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">48<\/span>\u00a0 \u00a0 \u00a0 <span class=\"nu0\">5<\/span> \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>invokeBasic<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>I <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">48<\/span>\u00a0 \u00a0 \u00a0 <span class=\"nu0\">6<\/span> \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToSpecial<span class=\"br0\">(<\/span>LL<span class=\"br0\">)<\/span>I <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">1<\/span> iteration<br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">69<\/span> \u00a0 <span class=\"nu0\">40<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToStatic<span class=\"br0\">(<\/span>ILIIL<span class=\"br0\">)<\/span>I <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">78<\/span> \u00a0 <span class=\"nu0\">48<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToStatic<span class=\"br0\">(<\/span>ILIJL<span class=\"br0\">)<\/span>I <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br><span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">79<\/span> \u00a0 <span class=\"nu0\">49<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>invokeBasic<span class=\"br0\">(<\/span>ILIJ<span class=\"br0\">)<\/span>I <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">86<\/span> \u00a0 <span class=\"nu0\">54<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>invokeBasic<span class=\"br0\">(<\/span>J<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">87<\/span> \u00a0 <span class=\"nu0\">55<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n <span class=\"nu0\">0<\/span> \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToSpecial<span class=\"br0\">(<\/span>LJL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br><span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">8962738<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">2<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">4<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">26759<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">26492<\/span><br><span class=\"sy0\">--------------------------------<\/span><\/div><\/div><\/pre>\n<p>The output is still not different from interpreted output! This is because, as per Oracle&#8217;s documentation, the <code>-XX:CompileThreshold<\/code> flag is effective only when <code>TieredCompilation<\/code> is disabled:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>Xbatch <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileCommandFile<span class=\"sy0\">=<\/span>hotspot_compiler <br><span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:-<\/span>TieredCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileThreshold<span class=\"sy0\">=<\/span><span class=\"nu0\">5<\/span> Demo<br><span class=\"nu0\">124<\/span> \u00a0 \u00a0 <span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 n \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToStatic<span class=\"br0\">(<\/span>LLLLLL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br><span class=\"nu0\">127<\/span> \u00a0 \u00a0 <span class=\"nu0\">2<\/span> \u00a0 \u00a0 \u00a0 n \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>invokeBasic<span class=\"br0\">(<\/span>LLLLL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">1<\/span> iteration<br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">187<\/span> \u00a0 <span class=\"nu0\">40<\/span> \u00a0 \u00a0 \u00a0 \u00a0n \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToStatic<span class=\"br0\">(<\/span>ILIIL<span class=\"br0\">)<\/span>I <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">212<\/span> \u00a0 <span class=\"nu0\">54<\/span> \u00a0 \u00a0 \u00a0 \u00a0n \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>invokeBasic<span class=\"br0\">(<\/span>J<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">212<\/span> \u00a0 <span class=\"nu0\">55<\/span> \u00a0 \u00a0 \u00a0 \u00a0n \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToSpecial<span class=\"br0\">(<\/span>LJL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">12337415<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">4<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">16<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">37183<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">5<\/span> iteration<br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">214<\/span> \u00a0 <span class=\"nu0\">56<\/span>\u00a0 \u00a0 \u00a0 \u00a0 b \u00a0 \u00a0 \u00a0 Demo<span class=\"sy0\">::init<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">(<\/span><span class=\"nu0\">5<\/span> bytes<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">215<\/span> \u00a0 <span class=\"nu0\">57<\/span>\u00a0 \u00a0 \u00a0 \u00a0 b \u00a0 \u00a0 \u00a0 Demo<span class=\"sy0\">::<\/span>square <span class=\"br0\">(<\/span><span class=\"nu0\">16<\/span> bytes<span class=\"br0\">)<\/span><br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">25<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">983002<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">6<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">36<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">81589<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">52393<\/span><\/span><\/div><\/div><\/pre>\n<p>This section of code is now JIT compiled after the fifth interpretation:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\"><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">5<\/span> iteration<br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">214<\/span> \u00a0 <span class=\"nu0\">56<\/span>\u00a0 \u00a0 \u00a0 \u00a0 b \u00a0 \u00a0 \u00a0 Demo<span class=\"sy0\">::init<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">(<\/span><span class=\"nu0\">5<\/span> bytes<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">215<\/span> \u00a0 <span class=\"nu0\">57<\/span>\u00a0 \u00a0 \u00a0 \u00a0 b \u00a0 \u00a0 \u00a0 Demo<span class=\"sy0\">::<\/span>square <span class=\"br0\">(<\/span><span class=\"nu0\">16<\/span> bytes<span class=\"br0\">)<\/span><br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">25<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">983002<\/span><br><span class=\"sy0\">--------------------------------<\/span><\/span><\/div><\/div><\/pre>\n<p>Along with the <code>square()<\/code> method, the constructor is also getting JIT compiled because there is a Demo instance inside the <code>for<\/code> loop before calling <code>square()<\/code>. Hence, it will also reach the threshold and be JIT compiled. This example illustrates when JIT comes into play after interpretation.\u00a0<\/p>\n<p>To see the compiled version of the code, use the <code>-XX:+PrintAssembly flag<\/code>, which works only if there is a disassembler in the library path. For OpenJDK, use the <code>hsdis<\/code> disassembler. Download a suitable disassembler library\u2014 in this case,\u00a0<code>hsdis-amd64.so<\/code>\u2014 and place it under <code>Java_HOME\/lib\/server<\/code>. Make sure to use <code>-XX:+UnlockDiagnosticVMOptions<\/code> before <code>-XX:+PrintAssembly<\/code>. Otherwise, JVM will give you a warning.\u00a0<\/p>\n<p>The entire command is as follows:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>Xbatch <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileCommandFile<span class=\"sy0\">=<\/span>hotspot_compiler  <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:-<\/span>TieredCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileThreshold<span class=\"sy0\">=<\/span><span class=\"nu0\">5<\/span> <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>UnlockDiagnosticVMOptions  <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintAssembly Demo<br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">5<\/span> iteration<br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">178<\/span> \u00a0 <span class=\"nu0\">56<\/span>\u00a0 \u00a0 \u00a0 \u00a0 b \u00a0 \u00a0 \u00a0 Demo<span class=\"sy0\">::init<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">(<\/span><span class=\"nu0\">5<\/span> bytes<span class=\"br0\">)<\/span><br>\nCompiled method <span class=\"br0\">(<\/span>c2<span class=\"br0\">)<\/span> \u00a0 \u00a0<span class=\"nu0\">178<\/span> \u00a0 <span class=\"nu0\">56<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Demo<span class=\"sy0\">::init<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">(<\/span><span class=\"nu0\">5<\/span> bytes<span class=\"br0\">)<\/span><br>\n\u00a0total in heap \u00a0<span class=\"br0\">[<\/span>0x00007fd4d08dad10,0x00007fd4d08dafe0<span class=\"br0\">]<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">720<\/span><br>\n\u00a0relocation \u00a0 \u00a0 <span class=\"br0\">[<\/span>0x00007fd4d08dae88,0x00007fd4d08daea0<span class=\"br0\">]<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">24<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br>\n\u00a0handler table \u00a0<span class=\"br0\">[<\/span>0x00007fd4d08dafc8,0x00007fd4d08dafe0<span class=\"br0\">]<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">24<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br>\n\u00a0dependencies \u00a0 <span class=\"br0\">[<\/span>0x00007fd4d08db3c0,0x00007fd4d08db3c8<span class=\"br0\">]<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">8<\/span><br>\n\u00a0handler table \u00a0<span class=\"br0\">[<\/span>0x00007fd4d08db3c8,0x00007fd4d08db3f8<span class=\"br0\">]<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">48<\/span><br><span class=\"sy0\">----------------------------------------------------------------------<\/span><br>\nDemo.<span class=\"me1\">square<\/span><span class=\"br0\">(<\/span>I<span class=\"br0\">)<\/span>I \u00a0<span class=\"br0\">[<\/span>0x00007fd4d08db1c0, 0x00007fd4d08db2b8<span class=\"br0\">]<\/span> \u00a0<span class=\"nu0\">248<\/span> bytes<br><span class=\"br0\">[<\/span>Entry <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+point\"><span class=\"kw3\">Point<\/span><\/a><span class=\"br0\">]<\/span><br><span class=\"br0\">[<\/span>Constants<span class=\"br0\">]<\/span><br>\n\u00a0 # <span class=\"br0\">{<\/span>method<span class=\"br0\">}<\/span> <span class=\"br0\">{<\/span>0x00007fd4b841f4b0<span class=\"br0\">}<\/span> <span class=\"st0\">'square'<\/span> <span class=\"st0\">'(I)I'<\/span> in <span class=\"st0\">'Demo'<\/span><br>\n\u00a0 # <span class=\"kw1\">this<\/span><span class=\"sy0\">:<\/span> \u00a0 \u00a0 \u00a0 rsi<span class=\"sy0\">:<\/span>rsi \u00a0 <span class=\"sy0\">=<\/span> <span class=\"st0\">'Demo'<\/span><br>\n\u00a0 # parm0<span class=\"sy0\">:<\/span>\u00a0 \u00a0 \u00a0 rdx \u00a0 \u00a0 <span class=\"sy0\">=<\/span> <span class=\"kw4\">int<\/span><br>\n\u00a0 # \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"br0\">[<\/span>sp<span class=\"sy0\">+<\/span>0x20<span class=\"br0\">]<\/span> \u00a0<span class=\"br0\">(<\/span>sp of caller<span class=\"br0\">)<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"br0\">[<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+stub\"><span class=\"kw3\">Stub<\/span><\/a> Code<span class=\"br0\">]<\/span><br>\n\u00a0 0x00007fd4d08db280<span class=\"sy0\">:<\/span> movabs $0x0,<span class=\"sy0\">%<\/span>rbx \u00a0 \u00a0 \u00a0\u00a0 \u00a0 <span class=\"sy0\">;<\/span> \u00a0 <span class=\"br0\">{<\/span>no_reloc<span class=\"br0\">}<\/span><br>\n\u00a0 0x00007fd4d08db28a<span class=\"sy0\">:<\/span> jmpq \u00a0 0x00007fd4d08db28a \u00a0<span class=\"sy0\">;<\/span> \u00a0 <span class=\"br0\">{<\/span>runtime_call<span class=\"br0\">}<\/span><br>\n\u00a0 0x00007fd4d08db28f<span class=\"sy0\">:<\/span> movabs $0x0,<span class=\"sy0\">%<\/span>rbx \u00a0 \u00a0 \u00a0\u00a0 \u00a0 <span class=\"sy0\">;<\/span> \u00a0 <span class=\"br0\">{<\/span>static_stub<span class=\"br0\">}<\/span><br>\n\u00a0 0x00007fd4d08db299<span class=\"sy0\">:<\/span> jmpq \u00a0 0x00007fd4d08db299 \u00a0<span class=\"sy0\">;<\/span> \u00a0 <span class=\"br0\">{<\/span>runtime_call<span class=\"br0\">}<\/span><br><span class=\"br0\">[<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> Handler<span class=\"br0\">]<\/span><br>\n\u00a0 0x00007fd4d08db29e<span class=\"sy0\">:<\/span> jmpq \u00a0 0x00007fd4d08bb880 \u00a0<span class=\"sy0\">;<\/span> \u00a0 <span class=\"br0\">{<\/span>runtime_call ExceptionBlob<span class=\"br0\">}<\/span><br><span class=\"br0\">[<\/span>Deopt Handler Code<span class=\"br0\">]<\/span><br>\n\u00a0 0x00007fd4d08db2a3<span class=\"sy0\">:<\/span> callq \u00a00x00007fd4d08db2a8<br>\n\u00a0 0x00007fd4d08db2a8<span class=\"sy0\">:<\/span> subq \u00a0 $0x5,<span class=\"br0\">(<\/span><span class=\"sy0\">%<\/span>rsp<span class=\"br0\">)<\/span><br>\n\u00a0 0x00007fd4d08db2ad<span class=\"sy0\">:<\/span> jmpq \u00a0 0x00007fd4d08a01a0 \u00a0<span class=\"sy0\">;<\/span> \u00a0 <span class=\"br0\">{<\/span>runtime_call DeoptimizationBlob<span class=\"br0\">}<\/span><br>\n\u00a0 0x00007fd4d08db2b2<span class=\"sy0\">:<\/span> hlt \u00a0 \u00a0<br>\n\u00a0 0x00007fd4d08db2b3<span class=\"sy0\">:<\/span> hlt \u00a0 \u00a0<br>\n\u00a0 0x00007fd4d08db2b4<span class=\"sy0\">:<\/span> hlt \u00a0 \u00a0<br>\n\u00a0 0x00007fd4d08db2b5<span class=\"sy0\">:<\/span> hlt \u00a0 \u00a0<br>\n\u00a0 0x00007fd4d08db2b6<span class=\"sy0\">:<\/span> hlt \u00a0 \u00a0<br>\n\u00a0 0x00007fd4d08db2b7<span class=\"sy0\">:<\/span> hlt \u00a0 \u00a0<br>\nImmutableOopMap<span class=\"br0\">{<\/span>rbp<span class=\"sy0\">=<\/span>NarrowOop <span class=\"br0\">}<\/span>pc offsets<span class=\"sy0\">:<\/span> <span class=\"nu0\">96<\/span><br>\nImmutableOopMap<span class=\"br0\">{<\/span><span class=\"br0\">}<\/span>pc offsets<span class=\"sy0\">:<\/span> <span class=\"nu0\">112<\/span><br>\nImmutableOopMap<span class=\"br0\">{<\/span>rbp<span class=\"sy0\">=<\/span>Oop <span class=\"br0\">}<\/span>pc offsets<span class=\"sy0\">:<\/span> <span class=\"nu0\">148<\/span> Square<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">25<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">2567698<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">6<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">36<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">76752<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">52888<\/span><\/span><\/span><\/div><\/div><\/pre>\n<p>The output is lengthy, so I&#8217;ve included only the output related to <code>Demo.java<\/code>.<\/p>\n<p>Now it&#8217;s time for AOT compilation. This option was introduced in JDK9. AOT is a static compiler to generate the <code>.so<\/code> library. With AOT, the interested classes can be compiled to create an <code>.so<\/code> library that can be directly executed instead of interpreting or JIT compiling. If JVM doesn&#8217;t find any AOT-compiled code, the usual interpretation and JIT compilation takes place.\u00a0<\/p>\n<p>The command used for AOT compilation is as follows:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"java geshifilter-java\">$ jaotc <span class=\"sy0\">--<\/span>output<span class=\"sy0\">=<\/span>libDemo.<span class=\"me1\">so<\/span> Demo.<span class=\"kw1\">class<\/span><\/code><\/span><\/pre>\n<p>To see the symbols in the shared library, use the following:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"java geshifilter-java\">$ nm libDemo.<span class=\"me1\">so<\/span><\/code><\/span><\/pre>\n<p>To use the generated <code>.so<\/code> library, use <code>-XX:AOTLibrary<\/code> along with <code>-XX:+UnlockExperimentalVMOptions<\/code> as follows:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>UnlockExperimentalVMOptions <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>AOTLibrary<span class=\"sy0\">=<\/span>.<span class=\"sy0\">\/<\/span>libDemo.<span class=\"me1\">so<\/span> Demo<br><span class=\"nu0\">1<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">7831139<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">2<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">4<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">36619<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">42085<\/span><\/div><\/div><\/pre>\n<p>This output looks as if it is an interpreted version itself. To make sure that the AOT compiled code is utilized, use <code>-XX:+PrintAOT<\/code>:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>UnlockExperimentalVMOptions <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>AOTLibrary<span class=\"sy0\">=<\/span>.<span class=\"sy0\">\/<\/span>libDemo.<span class=\"me1\">so<\/span> <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintAOT Demo<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">28<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 \u00a0 loaded \u00a0 \u00a0 \u00a0 \u00a0.<span class=\"sy0\">\/<\/span>libDemo.<span class=\"me1\">so<\/span> \u00a0aot library<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">80<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 \u00a0 aot<span class=\"br0\">[<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">]<\/span> \u00a0 Demo.<span class=\"me1\">main<\/span><span class=\"br0\">(<\/span><span class=\"br0\">[<\/span>Ljava<span class=\"sy0\">\/<\/span>lang<span class=\"sy0\">\/<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"sy0\">;<\/span><span class=\"br0\">)<\/span>V<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">80<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">2<\/span> \u00a0 \u00a0 \u00a0 \u00a0 aot<span class=\"br0\">[<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">]<\/span> \u00a0 Demo.<span class=\"me1\">square<\/span><span class=\"br0\">(<\/span>I<span class=\"br0\">)<\/span>I<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">80<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">3<\/span> \u00a0 \u00a0 \u00a0 \u00a0 aot<span class=\"br0\">[<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">]<\/span> \u00a0 Demo.<span class=\"sy0\">init<span class=\"sy0\">&gt;<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>V<br><span class=\"nu0\">1<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">7252921<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">2<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">4<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">57443<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">53586<\/span><\/span><\/div><\/div><\/pre>\n<p>Just to make sure that JIT compilation hasn&#8217;t happened, use the following:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>UnlockExperimentalVMOptions <span class=\"sy0\">-<\/span>Xbatch <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintCompilation  <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileCommandFile<span class=\"sy0\">=<\/span>hotspot_compiler <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:-<\/span>TieredCompilation  <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileThreshold<span class=\"sy0\">=<\/span><span class=\"nu0\">3<\/span> <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>AOTLibrary<span class=\"sy0\">=<\/span>.<span class=\"sy0\">\/<\/span>libDemo.<span class=\"me1\">so<\/span> <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintAOT Demo<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">19<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 \u00a0 loaded \u00a0 \u00a0 \u00a0 \u00a0.<span class=\"sy0\">\/<\/span>libDemo.<span class=\"me1\">so<\/span> \u00a0aot library<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">77<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 \u00a0 aot<span class=\"br0\">[<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">]<\/span> \u00a0 Demo.<span class=\"me1\">square<\/span><span class=\"br0\">(<\/span>I<span class=\"br0\">)<\/span>I<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">77<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">2<\/span> \u00a0 \u00a0 \u00a0 \u00a0 aot<span class=\"br0\">[<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">]<\/span> \u00a0 Demo.<span class=\"me1\">main<\/span><span class=\"br0\">(<\/span><span class=\"br0\">[<\/span>Ljava<span class=\"sy0\">\/<\/span>lang<span class=\"sy0\">\/<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"sy0\">;<\/span><span class=\"br0\">)<\/span>V<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">77<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">3<\/span> \u00a0 \u00a0 \u00a0 \u00a0 aot<span class=\"br0\">[<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">]<\/span> \u00a0 Demo.<span class=\"sy0\">init<span class=\"sy0\">&gt;<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>V<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">77<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">2<\/span> \u00a0 \u00a0 \u00a0 \u00a0 aot<span class=\"br0\">[<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">]<\/span> \u00a0 Demo.<span class=\"me1\">main<\/span><span class=\"br0\">(<\/span><span class=\"br0\">[<\/span>Ljava<span class=\"sy0\">\/<\/span>lang<span class=\"sy0\">\/<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"sy0\">;<\/span><span class=\"br0\">)<\/span>V \u00a0 made not entrant<br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">4<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">16<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">43366<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nSquare<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">100<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">59554<\/span><\/span><\/div><\/div><\/pre>\n<p>If any small change is made to the source code subjected to AOT, it&#8217;s important to ensure that the corresponding <code>.so<\/code> is created again. Otherwise, the stale AOT-compiled <code>.so<\/code> won&#8217;t have any effect. For example, make a small change to the square function such that now it&#8217;s calculating cube:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\"><span class=\"co1\">\/\/Demo.java<\/span><br><span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> Demo <span class=\"br0\">{<\/span><br><br>\n\u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> square<span class=\"br0\">(<\/span><span class=\"kw4\">int<\/span> i<span class=\"br0\">)<\/span> <span class=\"kw1\">throws<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw1\">return<\/span><span class=\"br0\">(<\/span>i<span class=\"sy0\">*<\/span>i<span class=\"sy0\">*<\/span>i<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 <span class=\"br0\">}<\/span><br><br>\n\u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> main<span class=\"br0\">(<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> args<span class=\"br0\">)<\/span> <span class=\"kw1\">throws<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw1\">for<\/span> <span class=\"br0\">(<\/span><span class=\"kw4\">int<\/span> i <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> i <span class=\"sy0\"> <span class=\"nu0\">10<\/span><span class=\"sy0\">;<\/span> i<span class=\"sy0\">++<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"\"<\/span> <span class=\"sy0\">+<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+integer\"><span class=\"kw3\">Integer<\/span><\/a>.<span class=\"me1\">valueOf<\/span><span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span><span class=\"sy0\">+<\/span><span class=\"st0\">\" iteration\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw4\">long<\/span> start <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">nanoTime<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw4\">int<\/span> r<span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> Demo<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>.<span class=\"me1\">square<\/span><span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"Square(i) = \"<\/span> <span class=\"sy0\">+<\/span> r<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw4\">long<\/span> end <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">nanoTime<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"Time taken= \"<\/span> <span class=\"sy0\">+<\/span> <span class=\"br0\">(<\/span>end<span class=\"sy0\">-<\/span>start<span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span><span class=\"st0\">\"--------------------------------\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"br0\">}<\/span><br>\n\u00a0 <span class=\"br0\">}<\/span><br><span class=\"br0\">}<\/span><\/span><\/div><\/div><\/pre>\n<p>Now, compile <code>Demo.java<\/code> again:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"java geshifilter-java\">$ java Demo.<span class=\"me1\">java<\/span><\/code><\/span><\/pre>\n<p>But, don&#8217;t create <code>libDemo.so<\/code> using <code>jaotc<\/code>. Instead, use this command:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>UnlockExperimentalVMOptions <span class=\"sy0\">-<\/span>Xbatch <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileCommandFile<span class=\"sy0\">=<\/span>hotspot_compiler <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:-<\/span>TieredCompilation <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>CompileThreshold<span class=\"sy0\">=<\/span><span class=\"nu0\">3<\/span> <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:<\/span>AOTLibrary<span class=\"sy0\">=<\/span>.<span class=\"sy0\">\/<\/span>libDemo.<span class=\"me1\">so<\/span> <span class=\"sy0\">-<\/span>XX<span class=\"sy0\">:+<\/span>PrintAOT Demo<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">20<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 \u00a0 loaded \u00a0 \u00a0 \u00a0 \u00a0.<span class=\"sy0\">\/<\/span>libDemo.<span class=\"me1\">so<\/span> \u00a0aot library<br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">74<\/span> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"nu0\">1<\/span> \u00a0 \u00a0 \u00a0 \u00a0 n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 java.<span class=\"me1\">lang<\/span>.<span class=\"me1\">invoke<\/span>.<span class=\"me1\">MethodHandle<\/span><span class=\"sy0\">::<\/span>linkToStatic<span class=\"br0\">(<\/span>LLLLLL<span class=\"br0\">)<\/span>L <span class=\"br0\">(<\/span><span class=\"kw1\">native<\/span><span class=\"br0\">)<\/span> \u00a0 <span class=\"br0\">(<\/span><span class=\"kw1\">static<\/span><span class=\"br0\">)<\/span><br><span class=\"nu0\">2<\/span> iteration<br>\nsqrt<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">8<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">43838<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">3<\/span> iteration<br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">137<\/span> \u00a0 <span class=\"nu0\">56<\/span> \u00a0 \u00a0 \u00a0 \u00a0b \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Demo<span class=\"sy0\">::init<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">(<\/span><span class=\"nu0\">5<\/span> bytes<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"nu0\">138<\/span> \u00a0 <span class=\"nu0\">57<\/span> \u00a0 \u00a0 \u00a0 \u00a0b \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Demo<span class=\"sy0\">::<\/span>square <span class=\"br0\">(<\/span><span class=\"nu0\">6<\/span> bytes<span class=\"br0\">)<\/span><br>\nsqrt<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">27<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">534649<\/span><br><span class=\"sy0\">--------------------------------<\/span><br><span class=\"nu0\">4<\/span> iteration<br>\nsqrt<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">64<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">51916<\/span><br><span class=\"br0\">[<\/span>...<span class=\"br0\">]<\/span><br><span class=\"nu0\">10<\/span> iteration<br>\nsqrt<span class=\"br0\">(<\/span>i<span class=\"br0\">)<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">1000<\/span><br><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+time\"><span class=\"kw3\">Time<\/span><\/a> taken<span class=\"sy0\">=<\/span> <span class=\"nu0\">47132<\/span><\/span><\/div><\/div><\/pre>\n<p>Though the old version of <code>libDemo.so<\/code> is loaded, JVM detected it as a stale one. Every time a <code>.class<\/code> file is created, a fingerprint goes into the class file, and a class fingerprint is kept in the AOT library. Because the class fingerprint is different from the one in the AOT library, AOT-compiled native code is not used. Instead, the method is now JIT compiled, because the <code>-XX:CompileThreshold<\/code> is set to 3.<\/p>\n<h2>AOT or JIT?<\/h2>\n<p>If you are aiming to reduce the warm-up time of the JVM, use AOT, which reduces the burden during runtime. The catch is that AOT will not have enough data to decide which piece of code needs to be precompiled to native code. \u00a0By contrast, JIT pitches in during runtime and impacts the warm-up time. However, it will have enough profiling data to compile and decompile the code more efficiently.<\/p>\n<\/div>\n<div class=\"clearfix text-formatted field field--name-field-article-subhead field--type-text-long field--label-hidden field__item\">\n<p>Use interpretation, just-in-time compilation, and ahead-of-time compilation efficiently by understanding the differences among them.<\/p>\n<\/div>\n<div class=\"field field--name-field-lead-image field--type-entity-reference field--label-hidden field__item\">\n<article class=\"media media--type-image media--view-mode-caption\">\n<div class=\"field field--name-field-media-image field--type-image field--label-hidden field__item\">  <img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/08\/studying-books-java-couch-education.png\" width=\"518\" height=\"292\" alt=\"Learning and studying technology is the key to success\" title=\"Learning and studying technology is the key to success\"><\/div>\n<div class=\"field field--name-field-caption field--type-text-long field--label-hidden caption field__item\"><span class=\"caption__byline\">Image by: <\/span><\/p>\n<p>Image by\u00a0<a href=\"https:\/\/www.wocintechchat.com\/\" rel=\"ugc noopener\" target=\"_blank\">WOCinTech Chat<\/a>,\u00a0<a href=\"https:\/\/creativecommons.org\/licenses\/by\/2.0\/\" rel=\"ugc noopener\" target=\"_blank\">CC BY 2.0<\/a><\/p>\n<\/div>\n<\/article>\n<\/div>\n<div class=\"field field--name-field-tags field--type-entity-reference field--label-hidden field__items\">\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/tags\/java\" hreflang=\"en\">Java<\/a><\/div>\n<\/p><\/div>\n<div class=\"hidden field field--name-field-listicle-title field--type-string field--label-hidden field__item\">What to read next<\/div>\n<div class=\"field field--name-field-default-license field--type-list-string field--label-hidden field__item\"><a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-sa\/4.0\/\"><br \/>\n        <img decoding=\"async\" alt=\"Creative Commons License\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/08\/cc-by-sa--12.png\" title=\"This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.\"><\/a>This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.<\/div>\n<section class=\"field field--name-field-comments field--type-comment field--label-hidden comment-wrapper\">\n<div class=\"comments__count\">\n<div class=\"login\"><a href=\"https:\/\/opensource.com\/user\/register?absolute=1\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml&amp;absolute=1\">Login<\/a> to post a comment.<\/div>\n<\/p><\/div>\n<\/section>\n<p class=\"wpematico_credit\"><small>Powered by <a href=\"http:\/\/www.wpematico.com\" target=\"_blank\" rel=\"noopener\">WPeMatico<\/a><\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A guide to JVM interpretation and compilation Jayashree Hutt\u2026 Tue, 08\/09\/2022 &#8211; 10:36 Register or Login to like Register or Login to like Java is a platform-independent language. Programs are converted to bytecode after compilation. This bytecode gets converted to machine code at runtime. An interpreter emulates the execution of bytecode instructions for the abstract [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":66346,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[307],"tags":[],"class_list":["post-66345","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-open-source"],"_links":{"self":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts\/66345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=66345"}],"version-history":[{"count":0,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts\/66345\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/media\/66346"}],"wp:attachment":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=66345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=66345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=66345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}