JVM 即时编译深度解析:C1/C2、分层编译、OSR 与日志分析
即时编译(JIT)是 JVM 性能的核心,它将热点字节码编译为本地机器码,实现接近 C++ 的执行速度。本文深入剖析 JIT 编译机制,帮助开发者理解并优化代码执行性能。
一、C1 与 C2 编译器对比
1.1 C1 编译器(Client Compiler)
定位:快速编译,优化启动性能
核心特点:
- 编译速度快:毫秒级完成编译,牺牲极致性能换取快速响应
- 优化策略简单:基础方法内联、常量折叠、局部变量优化
- 无 Profiling:不收集方法执行统计信息(调用次数、分支跳转)
- 适用场景:GUI 应用、短期运行程序、对启动时间敏感的场景
技术细节:
- 处理简单方法(Getter/Setter、短方法),编译后代码体积较小
- JDK 8 之前可通过
-client参数指定,JDK 8+ 该参数保留但无效(为兼容性)
代码示例:
// C1 擅长优化的简单方法
public String getName() {
return this.name; // 方法内联后几乎无开销
}
1.2 C2 编译器(Server Compiler)
定位:深度优化,追求峰值性能
核心特点:
- 编译速度慢:需数十毫秒到数百毫秒,进行激进优化
- 全局优化:基于性能监控数据(Profiling)的优化
- 逃逸分析(栈上分配、标量替换)
- 循环展开(Loop Unrolling)
- 分支预测(Profile-Guided Optimization)
- 公共子表达式消除
- 死代码消除
- 适用场景:长期运行的服务端应用、计算密集型任务
技术细节:
- 编译队列(Compile Queue)机制,后台线程异步编译
- JDK 8 之前可通过
-server参数指定,JDK 8+ 默认启用
1.3 Graal JIT 编译器(JDK 10+ 引入)
定位:C2 的替代者,支持 AOT 编译
特点:
- 用 Java 重写(C1/C2 用 C++),易于维护与扩展
- 支持提前编译(AOT)生成原生镜像(GraalVM Native Image)
- 性能与 C2 相当,某些场景更优
二、分层编译(Tiered Compilation)
2.1 核心思想
JDK 7+ 引入,结合 C1 的快速编译和 C2 的深度优化,形成 5 级编译体系。

