不可以不知的Java代码编译历程原创
导读
1. 编译流程主要包含哪些步?
2. javac命令主要是做什么事情的?
3. 什么是JIT?
4. Java程序有哪些执行模式?
1、程序编译执行流程
2、Java程序编译类型
2.1、Java程序编译执行过程
-
在前端编译时,把Java源文件编译为Class文件;
-
在解释执行时,会收集运行数据,根据热点代码进行JIT编译优化,生成本地机器码,加快程序的执行。
-
关于类加载器以及系统启动执行流程:一篇图文彻底弄懂类加载器与双亲委派机制
-
具体的加载Class文件到JVM的流程:一篇图文彻底弄懂Class文件是如何被加载进JVM的
3、javac
3.1、javac中的主要类
-
initProcessAnnotations(processors)
: -
准备过程:初始化插入式注解处理器
-
parseFiles(sourceFileObjects)
:解析步骤 -
词法分析
:将字符流转换为标记(Token
)集合(符号流); -
语法分析
:根据token序列构造抽象语法树,后续操作都建立在语法树上,语法分析相关类:Parser
; -
enterTrees
:填充符号表 -
processAnnotations()
: -
注解处理器的执行过程
-
delegateCompiler.compile2()
:分析及字节码生成 -
添加实例构造器
<init>()
方法和类构造器<clinit>()
方法; -
把字符串相加操作替换为StringBuffer或者StringBuilder(JDK 1.5+);
-
final类型的局部变量就是通过在这一步分析来保证不被重新赋值的;因为局部变量不像类变量,在Class文件中有CONSTANT_Fieldref_info符号引用,记录了访问标志。
-
attribute
:语义分析过程,标注检查,主要包括诸如变量使用前是否已被声明、变量与赋值之间的数据类型是否能够匹配等;同时会进行常量折叠(int a = 1+2 折叠为 int a =3); -
flow
:语义分析过程,数据及控制流分析。这一步是对程序上下文逻辑更进一步的验证,可以检查出诸如程序局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受检验异常都被正确处理了等问题。 -
desugar
:解除语法糖 -
generage
:生成字节码,同时会进行少量代码添加和转换工作。如: -
添加实例构造器
<init>()
方法和类构造器<clinit>()
方法; -
把字符串相加操作替换为StringBuffer或者StringBuilder(JDK 1.5+);
4、Java代码编译方式和JVM三种执行模式
1、编译分类
1.1、前端编译
-
Oracle Javac
-
Eclipse JDT中的增量式编译器(ECJ)
1.1.1、优点
-
辅助实现了Java新语法:泛型、内部类等;
-
编译成Class文件直接给JVM解释器执行,省去编译时间,加快启动速度。
1.1.2、缺点
-
几乎没有做任何措施优化代码的运行效率;
-
解释器执行效率低。
1.2、后端编译
-
HotSpot虚拟机的C1、C2编译器。
1.2.1、优点
-
运行时收集监控信息,把热点代码编译为本地机器码,并进行各种优化,例如:
-
运行数据分析,把堆栈操作转换为寄存器操作;
-
消除子表达式等
-
大大提升了执行效率。
1.2.2、缺点
-
收集监控信息影响程序运行;
-
编译过程占用时间,使得启动速度变慢等;
-
编译过程占用内存;
-
使用较少的diam的程序无法从即时编译中收益。
1.3、静态提前编译
1.3.1、优点
-
编译不占用运行时间,加快启动速度;
-
编译本地机器码直接保存到磁盘,不占用内存。
1.3.2、缺点
-
Java语言动态性带来了额外复杂度,影响静态编译代码的质量;
-
此方式一般不如JIT编译的质量。
2、三种执行模式
2 3 4 |
java version "1.8.0_71" Java(TM) SE Runtime Environment (build 1.8.0_71-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, mixed mode) |
2.1、解释执行模式
-Xint
参数:
2 3 4 |
java version "1.8.0_71" Java(TM) SE Runtime Environment (build 1.8.0_71-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, interpreted mode) |
2.2、编译执行模式
-Xcomp
参数:
2 3 4 |
java version "1.8.0_71" Java(TM) SE Runtime Environment (build 1.8.0_71-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, compiled mode) |
2.3、混合模式
JVM默认的执行模式,部分函数会解释执行,部分会编译执行。如果函数调用频率高,被反复使用,就会认为是热点代码,该函数就会被编译执行。