java编译期

前端编译器:把java文件转变成为class文件的过程。JDK的javac中的增量式编译器
即时编译器:运行期把字节码转变成本地机器码的过程。Hotspot虚拟机的c1,c2编译器
提前编译器:直接把程序编译成与目标机器指令集相关的二进制代码过程。JDK的jaotc

从java代码的总体结构来看,编译过程大致可以分为1个准备阶段和3个处理过程
1.准备阶段:初始化插入式注解处理器
2.解析与充填符号表过程
3.插入式注解处理器的注解处理过程
4.语义分析与字节码生成过程
注:上述3个处理过程里面,执行插入式注解时有可能会产生新的符号,如果有新的符号产生,就必须转回到之前的解析,填充符号表的过程中重新处理这些新符号。

解析与充填符号表过程
1.词法,语法分析:词法分析是将源代码的字符流转变为标记集合的过程,单个字符是程序编写时的最小元素,但是标记才是编译时的最小元素。语法分析是根据标记序列构造抽象语法树的过程。
2.填充符号表:符号表是由一组符号地址和符号信息构成的数据结构。符号表中所登记的内容在编译的不同阶段都要被用到。

注解处理过程
通过插入式注解处理器实现的插件在功能上有很大的发挥空间。能实现许多原本只能在编码中由人工完成的事情。

语义分析与字节码生成过程
经过语法分析后所得到的抽象语法树能够表示一个结构正确的源程序,但是无法保证源程序的语义是符合逻辑的。
语义分析的主要任务就是对结构上正确的源程序进行上下文相关性质的检查。
字节码阶段不仅仅是把前面各个步骤所生成的信息转化到字节码指令写到磁盘当中。

即时编译器
java程序最初都是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为热点代码,为了提高热点代码的执行效率,在运行的时候,虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,运行完成这个任务的后端编译器被称为即时编译器。

热点探测:
基于采样的热点探测:虚拟机会周期性地检查各个线程的调用栈顶,如果发现某个方法经常出现在栈顶,这个方法就是热点方法。
基于计数器的热点探测:虚拟机会为每个方法建立计数器,统计方法的执行次数,如果执行次数超过一定的阈值就认为它是热点方法。

Guess you like

Origin blog.csdn.net/nice_good_boy/article/details/120750093