JVM之编译器

1.编译器类型

一段代码是怎么通过简单的人类可读的字符变为机器可执行的010101机器码的,这个过程在JAVA领域涉及两个大的过程

编译期:检查是否有语法错误,如果没有就将其翻译成JVM可识别的字节码文件,即.class文件。把源代码(高级语言)转换成(翻译)低级语言(机器语言)的程序。

运行期:java虚拟机分配内存,解释执行字节码文件,并执行指令操作。

编译期用到的程序或代码就叫编译器,编译器在JVM中通常涉及2个概念:前端编译器和后端编译器

前端编译器:主要功能是把.java文件转换成.class文件,例如:Sun的javac、Eclipse的JDT的增量式编译器;

后端编译器:主要是把前面的.class字节码文件编程机器码,然后交给硬件机器去执行。

这其中后端编译器在JVM中有两种,JIT(Just In Time Compiler)和AOT(Ahead Of Time Compiler)编译器。

2.解释器和编译器

这里又有个解释器和编译器?跟上面的又是什么关系?在运行期间是解释模式还是编译模式,这么说应该更容易直白些。

传统的说法都说JAVA是编译型的语言,但实际上在运行期也有解释器的参与,这么说应该明白些,在运行期既有解释器也有编译器,这里的编译器通常在HotspotVM中就是指JIT.

解释器和编译器关系

目前主流的商用 JVM 内部都同时包含解释器与编译器,二者各有优势:

  • 程序需要迅速启动和执行时,解释器可以省去编译时间,立即执行。
  • 程序启动后,编译器逐渐发挥作用,把越来越多的代码编译成本地代码,可以减少解释器的中间消耗,提高执行效率。
  • 若运行环境的内存资源限制较大,可使用解释器执行节约内存;反之可使用编译执行来提升效率。

总结起来就是:

  • 解释器启动较快,占用内存较小,但是执行效率稍低。
  • 编译器启动较慢,占用内存较大,但执行效率较高。

JVM之编译器_第1张图片

Hotspot虚拟机内置了三个即时编译器,其中两个存在已久,分别是:

客户端编译器(Client Compiler)

服务端编译器(Server Compiler)

Graal编译器(JDK10以后才出现)

在分层编译(Tiered Compiation)的工作模式出现以前,HotSpot虚拟机通常是采用解释器与其中一个编译器直接搭配的方式工作,程序使用哪个编译器只取决于虚拟机运行的模式,HotSpot虚拟机会根据自身的版本与宿主机器的硬件性能自动选择运行模式,用户也可以使用 "-client"或"-server"参数去强制指定虚拟机运行在客户端模式还是服务器端模式。

 

 

 

 

 

你可能感兴趣的:(JAVA虚拟机)