JVM 的 C1/C2 编译器

JVM 即时编译器(JIT)与编译阈值整体讲解

一、JIT 编译器简介

在 Java 虚拟机(JVM)中,Java 代码首先被编译为字节码(.class 文件),运行时 JVM 会先用"解释器"将字节码一条条地解释执行。为了提升性能,JVM 会将热点代码(频繁执行的方法)编译为本地机器码,这个过程就叫做即时编译(JIT,Just-In-Time Compilation)。

HotSpot JVM 内置了两套 JIT 编译器:

  • C1 编译器(Client Compiler):启动快,优化较少,适合桌面应用或短生命周期程序。
  • C2 编译器(Server Compiler):优化深入,生成更高效的机器码,适合服务器端或长时间运行的应用。

二、分层编译(Tiered Compilation)

自 JDK7 起,HotSpot JVM 支持分层编译。简而言之,JVM 会先用 C1 编译器对方法进行快速编译和监控,收集足够的运行信息后,再用 C2 编译器做更高级的优化。分层编译兼顾了启动速度和最终性能。

默认情况下,分层编译是开启的(-XX:+TieredCompilation),现代 Java 应用通常采用这种模式。

三、热点代码与编译阈值(CompileThreshold)

JVM 如何判断某个方法是"热点"呢?这就需要借助编译阈值参数:

  • CompileThreshold:指定一个方法在解释执行时,被调用多少次后,JVM 就会将其认定为热点代码,触发 JIT 编译。

比如 -XX:CompileThreshold=10000,表示某方法被执行 10000 次后才会被编译为本地代码。

在分层编译开启时,实际编译时机还受到其它相关阈值参数影响,CompileThreshold主要影响最终 C2 编译阶段。

四、整体流程示意

  1. 方法首次被调用,解释执行,同时 JVM 开始统计调用次数。
  2. 调用次数达到 CompileThreshold,方法被认定为热点代码。
  3. JVM 触发 JIT 编译(C1 或 C2,或者分层),将方法编译为机器码。
  4. 编译后的方法以本地代码运行,性能大幅提升。

五、调优建议

  • 低阈值:方法更快被编译为本地代码,启动慢但运行性能提升快,适合短生命周期应用。
  • 高阈值:编译延后,减少编译器负担,适合长时间运行的服务。
  • 分层编译:通常无需修改,JVM 会自动权衡启动速度与性能。

实际调优时,可以通过参数如 -XX:CompileThreshold=5000-XX:+PrintCompilation 等观察和调整编译行为。

六、常用 JVM 参数

参数 作用 示例
-XX:CompileThreshold 设置编译阈值 -XX:CompileThreshold=5000
-XX:+TieredCompilation 启用分层编译(默认开启) -XX:+TieredCompilation
-XX:TieredStopAtLevel 控制分层编译深度 -XX:TieredStopAtLevel=1/4
-XX:+PrintCompilation 打印 JIT 编译日志 -XX:+PrintCompilation

七、总结

  • JVM 的 C1/C2 编译器负责将热点代码编译为高效机器码,提升 Java 程序性能。
  • 编译阈值 CompileThreshold 控制方法被编译的时机,影响启动速度与运行效率。
  • 分层编译机制结合了 C1 快速启动和 C2 高性能的优势,是现代 JVM 的默认模式。
  • 通过合理调节相关参数,可以根据应用场景优化 JVM 性能。

如需针对实际项目给出具体调优方案,或更深入了解 JVM 内部机制,欢迎继续提问!

相关推荐
BreezeJiang4 小时前
从域名到 Node.js:一次云服务器请求经过了哪些层?
服务器
Julien200415 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
2601_9620746817 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
大模型丫丫18 小时前
Hermes Agent:轻量级智能体框架实战指南
大数据·运维·服务器
mooooooooooye19 小时前
2026 年跨平台 SSH 客户端怎么选?Xterminal、Termius、MobaXterm 谁更合适
服务器·网络·ssh
Blockchina19 小时前
Codex 实战:从一句需求到可验收的 Linux 主机巡检脚本
运维·服务器·网络
Best-Wishes20 小时前
BurpSuite Pro教育版在linux系统中配置
linux·运维·服务器·网络安全·burpsuite
wuminyu20 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++
Java后端的Ai之路21 小时前
14、Python - 责任链模式
服务器·开发语言·人工智能·python·责任链模式
从入门到退休1 天前
企业远程控制选型:向日葵SDK vs RustDesk自建,谁是更务实的选择?
运维·服务器·网络·远程工作·远程控制