JVM中JIT编译器中C1和C2区别

什么是JIT编译器

JIT(Just-In-Time)编译器是Java虚拟机(JVM)中的即时编译器,它负责将Java字节码转换为本地机器代码。它的工作方式是在运行时动态地将经常执行的字节码编译为本地机器代码,以提高程序的性能。它通过以下步骤实现:

  • 解释执行(Interpretation):初始阶段,JVM会对Java字节码进行解释执行,不生成本地机器代码,这使得程序可以立即运行。
  • 即时编译(Just-In-Time Compilation):当某段代码(通常是被频繁执行的热点代码)被识别为性能瓶颈时,JIT编译器将这些热点代码编译成本地机器代码。这个过程包括对代码进行优化,以提高执行速度。
  • 本地机器代码执行(Execution of Native Code):一旦代码被编译成本地机器代码,JVM会直接执行这些代码,而不是再次解释执行对应的字节码。

也就是说,JIT编译器有助于提高Java程序的性能,因为它能够在运行时优化热点代码,将其转换为更高效的本地机器代码,从而减少解释执行的开销,提高程序运行速度。

JIT编译器分类

JIT编译器包含两个主要的即时编译器:C1(Client Compiler)和C2(Server Compiler)。

  • C1编译器通常用于快速启动和简单的应用程序,因为它生成的代码速度较快,但优化程度较低。
  • C2编译器更加激进,会花费更多时间进行更深层次的优化,生成更高效的本地机器代码,适用于需要更高性能的场景。

在应用程序启动阶段,会先试用C1编译器对代码进行编译。随着程序执行次数的积累,达到一定条件后会采用C2编译器对代码进行编译,这种方法在JVM中被称为分层编译。

关闭分层编译

可以通过JVM参数:-XX:-TieredCompilation 来关闭分层编译。

分层等级

可以通过JVM参数:-XX:TieredStopAtLevel=3 来设置分层编译等级,比如只开启C1关闭C2,具体等级如下表:

编译级别 描述
0 解释代码
1 简单的C1编译代码
2 有限的C1编译代码
3 完整的C1编译代码
4 C2编译代码

设置缓存区大小

JIT编译器在JVM内存中有一个代码缓存区域,用于存储它编译和优化的代码。默认情况下,代码缓存区域的大小为240MB。
可以通过JVM参数:-XX:ReservedCodeCacheSize=512m 来设置缓存区大小。

设置编译线程数

可以通过JVM参数:-XX:CICompilerCount=1 来设置编译器线程数。

参考资料:https://cloud.tencent.com/developer/article/2367465


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍