1、前端编译
把Java源码文件(.java)编译成Class文件(.class)的过程;
也即把满足Java语言规范的程序转化为满足JVM规范所要求格式的功能;
优点:
这阶段的优化是指程序编码方面的;
许多Java语法新特性("语法糖":泛型、内部类等等),是靠前端编译器实现的,而不是依赖虚拟机;
编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度;
缺点:
对代码运行效率几乎没有任何优化措施;
解释执行效率较低,所以需要结合下面的JIT编译;
前端编译器:Oracle javac、Eclipse JDT中的增量式编译器(ECJ)等;
2、后端编译/即时(JIT)编译
通过Java虚拟机(JVM)内置的即时编译器(Just In Time Compiler,JIT编译器);在运行时把Class文件字节码编译成本地机器码的过程;
优点:
通过在运行时收集监控信息,把"热点代码"(Hot Spot Code)编译成与本地平台相关的机器码,并进行各种层次的优化;
可以大大提高执行效率;
缺点:
收集监控信息影响程序运行;
编译过程占用程序运行时间(如使得启动速度变慢);
编译机器码占用内存;
JIT编译器:HotSpot虚拟机的C1、C2编译器等;
另外,JIT编译速度及编译结果的优劣,是衡量一个JVM性能的很重要指标;
所以对程序运行性能优化集中到这个阶段;
也就是说可以对这个阶段进行JVM调优;
3、JIT编译器:Client Compiler与Server Comiler
1、Client Compiler
简称C1编译器;
(A)、应用特点
较为轻量,只做少量性能开销比较高的优化,它占用内存较少,适合于桌面交互式应用;
2、Server Compiler
简称C2编译器,也叫Opto编译器;
(A)、应用特点
较为重量,采用了大量传统编译优化的技巧来进行优化,占用内存相对多一些,适合服务器端的应用;
4、前端编译+JIT编译
到这里,我们知道目前Java体系中主要还是采用前端编译+JIT编译的方式,如JDK中的HotSpot虚拟机。
前端编译+JIT编译方式的运作过程大体如下:
1、首先通过前端编译把符合Java语言规范的程序代码转化为满足JVM规范所要求Class格式;
2、然后程序启动时Class格式文件发挥作用,解释执行,省去编译时间,加快启动速度;
3、针对Class解释执行效率低的问题,在运行中收集性能监控信息,得知"热点代码";
4、JIT逐渐发挥作用,把越来越多的热点代码"编译优化成本地代码,提高执行效率;
5、最终执行过程
参考资料:
https://blog.csdn.net/yu870646595/article/details/78987805