目录
- 1. 说明
- 2. 作用
- 3. 特点
- 4. 编译流程
- 5. C1编译器与分层编译
- 6. C1编译器的相关参数
1. 说明
- 1.JVM(Java Virtual Machine)C1编译器是Java虚拟机中的一个即时编译器(Just-In-Time Compiler,JIT),也称为Client Compiler。
2. 作用
- 1.将Java字节码转换为本地机器代码,以提高程序的执行效率。
- 2.在运行时,JVM会动态地将经常执行的字节码编译为本地机器代码,这个过程包括对代码进行优化,以提高执行速度。
3. 特点
- 1.快速启动:C1编译器关注局部性优化,生成的代码速度较快,但优化程度相对较低。这使得C1编译器非常适合于执行时间较短或对启动性能有要求的程序,如GUI应用等。
- 2.简单优化:C1编译器会对代码进行一些基本的优化,如条件表达式消除、基本块消除、全局值编号(GVN)优化、数组范围检查消除和NULL检查消除等。这些优化有助于减少代码的大小和提高执行效率。
- 3.平台无关性:C1编译器生成的中间表示(IR)具有平台无关性,这使得优化过程更加方便。在优化完成后,C1编译器会将高级中间表示(HIR)转换为低级中间表示(LIR),然后基于LIR进行寄存器分配和机器代码生成。
4. 编译流程
- 1.字节码解析生成HIR:C1编译器首先会解析Java字节码,并生成高级中间表示(HIR)。HIR是由基本块构成的控制流图,基本块内部是SSA(Static Single Assignment)形式的指令序列。
- 2.HIR优化:在生成HIR后,C1编译器会对其进行一系列优化,如条件表达式消除、基本块消除、GVN优化、数组范围检查消除和NULL检查消除等。
- 3.HIR生成LIR:优化完成后,C1编译器会将HIR转换为低级中间表示(LIR)。
- 4.线性扫描寄存器分配:基于LIR,C1编译器会进行线性扫描寄存器分配,将虚拟寄存器映射到物理寄存器上。
- 5.机器代码生成:最后,C1编译器会生成本地机器代码,并将其放入nmethod中,以便JVM直接执行。
5. C1编译器与分层编译
- 1.在Java 7中,引入了分层编译(Tiered Compilation)的概念。
- 2.分层编译综合了C1编译器的启动性能优势和C2编译器的峰值性能优势。
- 3.分层编译将编译过程分为多个层次,每个层次都对应不同的优化级别。
- 4.第1层到第3层都使用C1编译器进行编译,但优化级别逐渐提高。
- 5.第4层则使用C2编译器进行编译,启用更多耗时较长的优化。
- 6.通过分层编译,JVM可以根据程序的运行情况动态地选择合适的编译路径,以达到最佳的性能表现。
- 7.例如,在程序启动阶段,JVM可能会选择使用C1编译器进行快速编译;而在程序运行稳定后,则可能会选择使用C2编译器进行更深入的优化。
6. C1编译器的相关参数
- 1.JVM提供了多个参数来控制C1编译器的行为。
- 2.-client:强制指定JVM使用C1编译器。
- 3.-XX:+TieredCompilation:开启分层编译(JDK 8之后默认开启)。
- 4.-XX:TieredStopAtLevel=N:将分层编译停留在第N层。例如,-XX:TieredStopAtLevel=3表示仅使用C1编译器进行编译,而不使用C2编译器。
- 5.-XX:+PrintCompilation:输出应用代码的编译细节,方便进行性能调优。