JVM基本原理:Java代码是怎么运行的?

153 阅读2分钟

JVM基本原理:Java代码是怎么运行的?

7a0c6b29-268b-4030-957e-51a3f52d779c(1).png

JVM怎么运行字节码的?

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

第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行。

image.png

HotSpot默认混合模式,先解释字节码,然后将反复执行的热点代码以方法为单位进行即时编译

虚方法

我们知道虚方法是用来实现面向对象语言多态性的。对于一个虚方法调用,尽管它有很多个目标方法,但在实际运行过程中它可能只调用其中的一个。这个信息便可以被即时编译器所利用,来规避虚方法调用的开销,从而达到比静态编译的C++ 程序更高的性能

多个即时编译器

为了满足不同用户场景的需要,HotSpot 内置了多个即时编译器,之所以引入多个即时编译器,是为了在编译时间和生成代码的执行效率之间进行取舍。

C1又叫做 Client 编译器,面向的是对启动性能有要求的客户端 GUI 程序,采用的优化手段相对简单,因此编译时间较短。

C2:Server编译器,面向对峰值性能又要求的服务端程序,采用优化相对复杂,因此编译时间长,但生成代码执行效率高

Java7开始,HotSpot默认分层编译:热点方法先被C1编译,然后热点方法中的热点进一步被C2编译

为了不干扰应用正常运行,HotSpot即时编译是放在额外的编译线程中进行的,HotSpot会根据CPU数量设置编译线程数量,并按1:2配置给C1,C2编译器

在计算资源充足情况下,字节码解释执行和即时编译可以同时进行,编译完成后的机器码会在下次调用该方法时启动,以替换原本的解释执行