作为一名Java
程序员,都知道Java
代码是运行在这Java虚拟机
上面的。
在这里,我们思考两个问题,为什么Java
代码要运行在Java虚拟机
上面,
而Java虚拟机又是如何执行Java字节码
的?
为什么Java代码要运行在Java虚拟机上面
这么做的意义在于,一旦一个程序被转换成Java 字节码
,那么它便可以在不同平台上的虚拟机实现里运行。这也就是我们经常说的“一次编写,到处运行”。
Java虚拟机又是如何执行Java字节码的?
从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到Java 虚拟机
中。加载后的Java 类
会被存放于方法区(Method Area
)中。实际运行时,虚拟机会执行方法区内的代码。
从硬件视角来看,Java 字节码
无法直接执行。因此,Java 虚拟机
需要将字节码翻译成机器码。
在 HotSpot
里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(Just-In-Time compilation,JIT
),即将一个方法中包含的所有字节码编译成机器码后再执行。
前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。HotSpot
默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。
来源:极客时间