前端编译

主要功能就是把.java代码转换成.class代码,生成.class文件

后端编译

后端编译主要是将中间代码再翻译成机器语言。Java中,这一步骤就是Java虚拟机来执行的。

java代码翻译 java代码翻译成class_编译器

词法分析:

左到右一个个字符读入源程序,将字符序列转换为标记序列的过程。

语法分析:

根据标记序列 构造 抽象语法树,用于描述程序语法结构是否正确。

语义分析:

对程序进行逻辑检查,对结构正确的源程序,进行上下文有关性质的审查。其中一个重要部分就是类型检查。

中间代码生成:

将前面各个步骤生成的信息转化成字节码写入.class文件。

后端编译主要是将中间代码再翻译成机器语言。Java中,这一步骤就是Java虚拟机来执行的。

传统的JVM的解释器

解释器是jvm虚拟机的一部分,java默认采用解释器与其中一个编译器直接配合的方式工作,解释器通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。

在部分虚拟机中, Java程序是通过解释器进行解释执行的, 当虚拟机发现某个方法或代码块的运行特别频繁时, 虚拟机采用热点检测,就会把这些代码认定为"热点代码"。为了提高热点代码的执行效率, 在运行时, 虚拟机将会把这些代码编译成与本地平台相关的机器码, 并进行优化, 完成这个任务的编译器称为即时编译器(JIT编译器)。虚拟机在代码编译器还未完成之前, 都仍然将按照解释方式继续执行, 而编译动作则在后台的编译线程中进行。

热点检测

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

编译优化

JIT除了具有缓存的功能外,还会对代码做各种优化。例如: 锁消除、 锁膨胀、 空值检查消除、 类型检测消除、 公共子表达式消除、 方法内联、逃逸分析。