首先我们需要了解Java 程序从源代码到运行的过程:
Java 程序从源代码到运行一般有下面 3 步:
1、代码书写完成之后,保存成.Java文件。
2、.Java文件运行时,Java不是直接编译或解释成机器码文件的,它会先通过JDK中的javac.exe编译成Java虚拟机(JVM )可理解的字节码文件,此时,Java使用了编译。
3、字节码文件之后会被虚拟机JVM逐行解释成机器可执行的二进制机器码,此时,Java使用了解释。
4、从.class文件到机器码这一步, JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而 JIT 属于运行时编译。
当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
原文:https://www.cnblogs.com/lsm-boke/p/14624646.html