写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

补充

Java 代码 -> Java 字节码

从虚拟机角度来看,执行 Java 代码需要将编译好的字节码文件加载到 Java 虚拟机中。

在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。

栈帧的大小是提前计算好的,JVM不要求栈帧在内存空间里连续分布。

当退出当前执行的方法时,不管是正常返回还是异常返回,JVM均会弹出当前线程的当前栈帧,并将之舍弃。

Java 字节码 -> 机器码

从硬件视角来看,Java 字节码无法直接执行,JVM需要将字节码翻译成机器码。

上述翻译过程有两种形式

  1. 解释执行,即逐条将字节码翻译成机器码并执行;

  2. 即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行。

前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。
HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。

更多推荐

Java代码如何在虚拟机中运行?