IT袋

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

JVM解释和编译指南

JVM解释和编译指南(2)

时间:2023-11-09 14:37:26 来源:IT袋 作者:马勇
导读:JVM解释和编译指南,AOT 编译器在构建期编译代码。在构建时将需要频繁解释和 JIT 编译的代码直接编译为机器码可以缩短 Java 虚拟机Java Virtual Machine(JVM) 的预热warm-up时间。

JVM解释和编译指南

AOT 编译器在构建期编译代码。在构建时将需要频繁解释和 JIT 编译的代码直接编译为机器码可以缩短 Java 虚拟机Java Virtual Machine(JVM) 的预热warm-up时间。(LCTT 译注:Java 程序启动后首先字节码被解释执行,此时执行效率较低。等到程序运行了足够的时间后,代码热点被检测出来,JIT 开始发挥作用,程序运行效率提升。JIT 发挥作用之前的过程就是预热。)AOT 是在 Java 9 中引入的一个实验性特性。jaotc使用 Graal 编译器(它本身也是用 Java 编写的)来实现 AOT 编译。

Hello.java为例:

//Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Inside Hello World!");
    }
}
$ javac Hello.java
$ jaotc --output libHello.so Hello.class
$ java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./libHello.so Hello
Inside Hello World!

解释和编译发生的时机

下面通过例子来展示 Java 在什么时候使用解释器,以及 JIT 和 AOT 何时参与进来。这里有一个简单的程序Demo.java:

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

在这个程序的main方法中创建了一个Demo对象的实例,并调用该实例的square方法,然后显示for循环迭代变量的平方值。编译并运行它:

$ javac Demo.java
$ java Demo
1 iteration
Square(i) = 1
Time taken= 8432439
--------------------------------
2 iteration
Square(i) = 4
Time taken= 54631
--------------------------------
.
.
.
--------------------------------
10 iteration
Square(i) = 100
Time taken= 66498
--------------------------------

上面的结果是由谁产生的呢?是解释器,JIT 还是 AOT?在目前的情况下,它完全是通过解释产生的。我是怎么得出这个结论的呢?只有代码被解释的次数必须超过某个阈值时,这些热点代码片段才会被加入 JIT 编译队列。只有这时,JIT 编译才会发挥作用。使用以下命令查看 JDK 11 中的该阈值:

$ java -XX:+PrintFlagsFinal -version | grep CompileThreshold
 intx CompileThreshold     = 10000                                      {pd product} {default}
[...]
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment 18.9 (build 11.0.13+8)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8, mixed mode, sharing)

上面的输出表明,一段代码被解释 10,000 次才符合 JIT 编译的条件。这个阈值是否可以手动调整呢?是否有 JVM 标志可以指示出方法是否被 JIT 编译了呢?答案是肯定的,而且有多种方式可以达到这个目的。

使用-XX:+PrintCompilation选项可以查看一个方法是否被 JIT 编译。除此之外,使用

相关阅读

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

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

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

  • 如何实现一个IOC容器?

    如何实现一个IOC容器?

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

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

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

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

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

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

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