剑指JVM:虚拟机实践与性能调优
上QQ阅读APP看书,第一时间看更新

1.7 Java代码执行流程

Java源文件经过编译器的词法分析、语法分析、语义分析、字节码生成器等一系列过程生成以“.class”为后缀的字节码文件。Java编译器编译过程中,任何一个节点执行失败都会造成编译失败。字节码文件再经过JVM的类加载器、字节码校验器、翻译字节码(解释执行)或JIT编译器(编译执行)的过程编译成机器指令,提供给操作系统进行执行。

JVM的主要任务就是将字节码装载到其内部,解释/编译为对应平台上的机器指令执行。JVM使用类加载器(Class Loader)装载class文件,虽然各个平台的JVM内部实现细节不尽相同,但是它们共同执行的字节码内容却是一样的。类加载完成之后,会进行字节码校验,字节码校验通过,JVM解释器会把字节码翻译成机器码交由操作系统执行。

早期,我们说Java是一门解释型语言,因为在Java刚诞生,即JDK1.0的时候,Java的定位是一门解释型语言,也就是将Java程序编写好之后,先通过javac将源码编译为字节码,再对生成的字节码进行逐行解释执行。现在我们提到Java,更多地认为其是一门半编译半解释型的语言,因为Java为了解决性能问题,采用了一种叫作JIT即时编译的技术,也就是将执行比较频繁的整个方法或代码块直接编译成本地机器码,以后执行这些方法或代码时,直接执行生成的机器码即可。换句话说,在HotSpot VM内部,即时编译器与解释器是并存的,通过编译器与解释器的协同工作,既可以保证程序的响应时间,同时还能够提高程序的执行性能。目前市面上大多数主流虚拟机都采用此架构。Java代码的具体执行流程,如图1-9所示。

图1-9 Java代码执行流程