
物理机的执行引擎是直接建立在CPU、缓存、指令集和OS层面上的;JVM的执行引擎由软件实现,能够执行不被硬件直接支持的指令集格式
字节码不能直接运行在OS(因为字节码指令不等价于本地机器指令),执行引擎将字节码指令解释/JIT编译为对应平台的本地机器指令
橙色部分即通过javac命令生成一系列的字节码指令(前端编译器的工作)
绿色和蓝色部分是JVM需要执行的部分

下图即绿色(解释器的工作)和蓝色(JIT编译器的工作)部分详细图解:

为什么Java是半解释半编译型语言?并不是因为源代码先翻译为字节码文件,字节码文件再解释执行(Java1.0时期的解释,因为没有JIT编译器)。而是因为字节码在生成机器指令时既可以使用解析器,也可使用JIT编译器

把机器码中特定的0/1序列简化为对应的指令(如mov、inc等)
不同的硬件平台的同一个指令对应的机器码可能不同
不同的硬件平台支持的指令是有差别的,所以每个平台有自己的指令集

二进制文件,但是比机器码抽象
与硬件环境无关(即不同的编译器可以编译出相同的字节码文件),主要为了实现特定软件运行和软件环境(即字节码文件在不同的JVM上运行)
编译器将源码编译成字节码,特定平台上的虚拟机将字节码转译为可直接执行的指令
为什么不直接将源文件编译为不同平台的虚拟机可以执行的文件,还需要一个中间产物字节码,这不也同样也能实现字节码文件提供的跨平台性?为了实现跨语言,假设源文件是不同编程语言编写的文件,此时编写为具有相同标准的字节码文件可以方便虚拟机去编译
既然有JIT编译器,为什么还需要解释器(比如JRockit VM就全靠JIT编译器执行)?因为JVM启动后,解释器可以先发挥作用,不必等JIT编译器全部编译再执行,省去许多不必要的编译时间。随着程序运行时间推移,JIT编译器中的热点探测功能将有价值的字节码编译为本地机器指令,提高执行效率