java的编译与解释过程

1、java的编译与解释过程
(1)java代码经过前端编译转换为字节码文件(.class文件);
(2)字节码文件被JVM的内置编译器转换为机器语言并运行,这部分在不用的JVM使用的方法不同,以下是两种使用较多的方法:
1)及时编译(JIT:just-in-time complier)是一种动态编译方式,将字节码文件中热点部分进行编译并存储,如HotSpot虚拟机的C1和C2编译器;
2)提前编译(Ahead-of-time complier)是一种静态编译方式,它将字节码文件以及相关的库提前编译成机器语言。

java的编译与解释过程_第1张图片

2、前端编译的过程
(1)解析和填充符号表;
过程包括词法分析、语法分析和符号表填充;
(2)插入式注解处理器的注解处理;
(3)语义分析与字节码生成;

3、Java编译执行和解释执行的作用
(1)HotSpot VM是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
但是如今的HotSpot VM中不仅内置有解释器,还内置有先进的JIT(Just In Time Compiler)编译器,在Java虚拟机运行时,解释器和即时编译器能够相互协作,各自取长补短。有一点需要注意,无论是采用解释器进行解释执行,还是采用即时编译器进行编译执行,最终字节码都需要被转换为对应平台的本地机器指令。

(2)既然HotSpot VM中已经内置JIT编译器了,那么为什么还需要再使用解释器来“拖累”程序的执行性能呢?
对于服务端应用来说,启动时间并非是关注重点,但对于那些看中启动时间的应用场景而言,或许就需要采用解释器与即时编译器并存的架构来换取一个平衡点。

(3)由于即时编译器将本地机器指令的编译推迟到了运行时,自此Java程序的运行性能已经达到了可以和C/C++程序一较高下的地步。这主要是因为JIT编译器可以针对那些频繁被调用的“热点代码”做出深度优化,而静态编译器的代码优化则无法完全推断出运行时热点,因此通过JIT编译器编译的本地机器指令比直接生成的本地机器指令拥有更高的执行效率也就理所当然了。

4、JIT编译的优化
  Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行优化完成这个任务的编译器称为即使编译器。
识别热点代码的两种方法:
(1) 基于采样的热点探测
该方法是周期探测线程栈顶,若发现某种方法经常出现则认为是热点代码;
(2)基于计数器的热点探测
采用这种方法的虚拟机会为每个方法(甚至是代码块)建立计数器,统计方法的执行次数,如果执行次数超过一定的阀值,就认为它是“热点方法”。

你可能感兴趣的:(java基础)