IT袋

当前位置:主页 > 经验教程 > 建站编程 >

JVM解释和编译指南

JVM解释和编译指南(5)

时间:2023-11-09 14:37:26 来源:IT袋 作者:马勇
导读:JVM解释和编译指南,从输出上看,跟完全用解释的情况没有区别。为了确认 AOT 发挥了作用,使用 -XX:+PrintAOT : $ java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./libDemo.so -XX:+PrintAO

JVM解释和编译指南

从输出上看,跟完全用解释的情况没有区别。为了确认 AOT 发挥了作用,使用-XX:+PrintAOT

$ java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./libDemo.so -XX:+PrintAOT Demo
         28        1         loaded        ./libDemo.so  aot library
         80        1         aot[ 1]   Demo.main([Ljava/lang/String;)V
         80        2         aot[ 1]   Demo.square(I)I
         80        3         aot[ 1]   Demo.

要确认没有发生 JIT 编译,用如下命令:

$ java -XX:+UnlockExperimentalVMOptions -Xbatch -XX:+PrintCompilation \ -XX:CompileCommandFile=hotspot_compiler -XX:-TieredCompilation \ -XX:CompileThreshold=3 -XX:AOTLibrary=./libDemo.so -XX:+PrintAOT Demo
         19        1         loaded        ./libDemo.so  aot library
         77        1         aot[ 1]   Demo.square(I)I
         77        2         aot[ 1]   Demo.main([Ljava/lang/String;)V
         77        3         aot[ 1]   Demo.

需要特别注意的是,修改被 AOT 编译了的源代码后,一定要重新生成.so库文件。否则,过时的的 AOT 编译库文件不会起作用。例如,修改square方法,使其计算立方值:

//Demo.java
public class Demo {
    public int square(int i) throws Exception {
        return(i*i*i);
    }
    public static void main(String[] args) throws Exception {
        for (int i = 1; i 

重新编译Demo.java

$ java Demo.java

但不重新生成libDemo.so。使用下面命令运行Demo

$ java -XX:+UnlockExperimentalVMOptions -Xbatch -XX:+PrintCompilation -XX:CompileCommandFile=hotspot_compiler -XX:-TieredCompilation -XX:CompileThreshold=3 -XX:AOTLibrary=./libDemo.so -XX:+PrintAOT Demo
         20        1         loaded        ./libDemo.so  aot library
         74        1         n           java.lang.invoke.MethodHandle::linkToStatic(LLLLLL)L (native)   (static)
2 iteration
sqrt(i) = 8
Time taken= 43838
--------------------------------
3 iteration
        137   56        b            Demo::

可以看到,虽然旧版本的libDemo.so被加载了,但 JVM 检测出它已经过时了。每次生成.class文件时,都会在类文件中添加一个指纹,并在 AOT 库中保存该指纹。修改源代码后类指纹与旧的 AOT 库中的指纹不匹配了,所以没有执行 AOT 编译生成的原生机器码。从输出可以看出,现在实际上是 JIT 在起作用(注意-XX:CompileThreshold被设置为了 3)。

AOT 和 JIT 之间的权衡

如果你的目标是减少 JVM 的预热时间,请使用 AOT,这可以减少运行时负担。问题是 AOT 没有足够的数据来决定哪段代码需要预编译为原生代码。相比之下,JIT 在运行时起作用,却对预热时间有一定的影响。然而,它将有足够的分析数据来更高效地编译和反编译代码。

以上IT袋网网介绍的JVM解释和编译指南的全文内容,IT袋网[www.itdai.com]希望对网友有所帮助!

相关阅读

  • 找装修公司去哪个网站好 网上找装修公司的小窍门

    找装修公司去哪个网站好 网上找装修公司的小窍门

    对于许多网友来说找装修公司去哪个网站好和网上找装修公司的小窍门IT技巧方面的经验,下面IT袋为您详细介绍 现在的互联网大大改善了生活便捷度,装修网站作为专业化装修服务平台,为广

  • 如何实现一个IOC容器?

    如何实现一个IOC容器?

    小编为大家说一说如何实现一个IOC容器的相关经验,一起来了解了解吧。 概括来说分为四步: 配置文件配置包扫描路径 递归包扫描获取.class文件 反射、确定需要交给IOC管理的类 对需要注入的

  • 如何自建云服务器设置 搭建一个私有云平台

    如何自建云服务器设置 搭建一个私有云平台

    小编为网友们解答如何自建云服务器设置和搭建一个私有云平台方面的知识,具体详情如下: 如果选择云服务器的配置,总的来说要根据应用场景需求来。在云服务器的产品页面,会根据不同

  • 深入学习:MySQL中查询重复数据的有效方法

    深入学习:MySQL中查询重复数据的有效方法

    一篇方法教程,与您分享的IT小经验,接下来分享详细内容。 在进行数据库操作时,我们经常需要找出重复的数据。 在MySQL数据库中,有多种方法可以实现这个目标。 本文将向你展示如何在