java编译过程
C,C++ 语言编译,其实就是通过编译器,直接把代码变成机器码,机器可以直接执行了。
但是java不一样,java是一门可以跨平台的语言,也是一门面向对象的语言,Java编译程序,首先是 javac,直接将java源程序变成java字节码文件,也就是.class文件——JVM可以直接执行的文件,然后再通过JVM来执行,此时有两种执行方式,也就是解释执行和编译执行,这样就实现了跨平台的功能,每台机器只需要装JVM就可以执行java字节码文件。
所以,总结一下,java编译的步骤就是:
java源程序,通过javac 变成 java字节码文件,再通过 java虚拟机,进行执行!
解释执行
解释器不会一次把整个程序转译出来,它每转译一行程序就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。也就是解释一句,执行一句,这些就特别缓慢。效率也比较低,这也就是java比C、C++速度慢的原因之一,早期java程序就是这样执行的,但HotSpot虚拟机,引入了JIT技术,也就是接下来要说的编译执行。
编译执行(使用JIT技术)
JIT:Just In Time Compiler,一般翻译为即时编译器,这是是针对解释型语言而言的,而且并非虚拟机必须,是一种优化手段,Java的商用虚拟机HotSpot就有这种技术手段,Java虚拟机标准对JIT的存在没有作出任何规范,所以这是虚拟机实现的自定义优化技术。
HotSpot虚拟机的执行引擎在执行Java代码是可以采用【解释执行】和【编译执行】两种方式的,如果采用的是编译执行方式,那么就会使用到JIT,而解释执行就不会使用到JIT,所以,早期说Java是解释型语言,是没有任何问题的,而在拥有JIT的Java虚拟机环境下,说Java是解释型语言严格意义上已经不正确了。
HotSpot中的编译器是javac,他的工作是将源代码编译成字节码,这部分工作是完全独立的,完全不需要运行时参与,所以Java程序的编译是半独立的实现。有了字节码,就有解释器来进行解释执行,这是早期虚拟机的工作流程,后来,虚拟机会将执行频率高的方法或语句块通过JIT编译成本地机器码,提高了代码执行的效率,至此你已经了解了JIT在Java虚拟机中所处的地位和工作的主要内容。
工作原理
当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码。
通常javac将程序源码编译,转换成java字节码,JVM通过解释字节码将其翻译成相应的机器指令,逐条读入,逐条解释翻译。非常显然,经过解释运行,其运行速度必定会比可运行的二进制字节码程序慢。为了提高运行速度,引入了JIT技术。
在执行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,採用该JIT技术能够,能够接近曾经纯编译技术。
但JIT也并不是万能的,JIT并不总是奏效,由于JIT对每条字节码都进行编译,造成了编译过程负担过重,有时候我们关闭JITjava.lang.Compiler.disable(),也可以加快运行的速度。由于JIT对每条字节码都进行编译,造成了编译过程负担过重。为了避免这样的情况,当前的JIT仅仅对常常运行的字节码进行编译,如循环等
参考文献:
https://blog.youkuaiyun.com/qq_36042506/article/details/82976586