{首先不应该混淆java的编译和其他的语言(比如C)的编译二字的含义,C语言的编译包含两个过程,汇编和编译,C语言代码被汇编之后,会得到汇编语言代码,而编译就是将汇编语言代码翻译称为机器指令代码的过程,然后在经过一个链接的过程生成了一个可执行的文件。所以C语言经历过编译步骤之后直接就变成了可以被平台底层执行的代码了,这个过程是最初的编译的含义。

而java的执行过程是,首先通过javac编译java源代码为字节码,然后JVM将这些字节码文件加载进来,加载进来一句,就解释一句,解释出来一句就执行一句,相当于是解释和执行是同步执行的,这种模式被称为解释执行

需要明确的一点:解释执行这个过程并不会产生目标文件,也就是说这些可以被平台执行的机器码文件并没有生成,下次如果还是这部分代码被执行的时候,还需要重新的被解释一遍,这样每次都重复这个过程就会很耗时,因此java引入了JIT,(在程序运行时) 将那些执行比较频繁的代码,也被称作热点代码,编译成为机器码,这个时候其实内存中是保存了一部分这部分机器码的,这样就解决了上面所描述的问题。

但是因为JIT是运行时将字节码文件编译成为机器码文件,所以会占用运行时资源,造成进程卡断,因此就又引入了AOT(静态编译),就是在程序运行之前就将字节码编译成为机器码,不会占用到运行时的CPU资源。这样就解决了JIT的问题。

但是这样的话在某些程度上其实就和C语言一样了,牺牲了java的跨平台特性,所以JIT和AOT都有不同的优缺点,所以我们可以在虚拟机的指令中指定启动虚拟机的时候采用的模式。来更好的控制虚拟机为我们带来更好的编程体验。}

有一点不太认同,AOT静态编译,虽然是直接编译成机器码,但是java源文件是不需要修改的,但是C语言针对不同的系统需要修改源文件以适配操作系统提供的API