CcNut`s Blog
506 字
3 分钟
Java源代码运行的过程

一、编写一个Java程序#

现在我们编写一个简单的.java源代码文件,以经典的Hello World程序为例。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

二、编译Java程序#

我们已经有了一个.java程序,现在需要将其编译成字节码文件.class

编译过程由Java编译器(javac)完成,它会将.java源代码编译成.class字节码文件,以便JVM可以执行。

编译命令如下:

javac <filename>.java

编译完成后,会在当前目录下生成一个.class文件。

字节码不针对某一种特定的机器,因此编译后的字节码文件可以运行在任何支持Java虚拟机(JVM)的平台上。

三、字节码->机器码#

为什么说Java是编译和解释共存的语言呢,这里会给出答案。

从字节码转换为机器能明白的机器码的过程中,JVM类加载器首先加载字节码文件,再由解释器逐行解释为机器码并执行

但是这样有一个弊端,每次运行程序都需要重新解释字节码,很多常用的方法以及代码块被反复解释(热点代码),效率很低

为了提高效率,JVM引入了JIT(Just-In-Time)编译器,它会将热点代码编译成机器码并缓存起来,以便下次运行时直接使用缓存的机器码。

AOT(Ahead-Of-Time)编译器#

AOT是JDK9引入的一种新的编译模式,它和JIT不同,它在程序执行前就将其全部编译为机器码,属于静态编译(C,C++,Rust,Go就是静态编译语言),它避免了JIT预热等各方面的开销,提高了Java的启动速度,而且其不容易被反编译和修改,也大大提升了程序的安全性,特别适合云原生场景。1

Footnotes#

  1. Java基础常见面试题总结(上) AOT 有什么优点?为什么不全部使用 AOT 呢?

Java源代码运行的过程
https://ccnut0519.github.io/posts/learn/java源代码运行的过程/
作者
CcNut
发布于
2024-04-11
许可协议
CC BY-NC-SA 4.0