C1 编译器(Client Compiler)
理解 C1 编译器,是理解 JVM 分层编译策略的基础。
C1 编译器概述
C1 编译器有以下特点:
C1 编译器架构
C1 编译器分为多个阶段:
阶段一:HIR 生成
将字节码转换为高级中间表示(HIR):
阶段二:HIR 优化
在 HIR 层面进行基础优化:
- 常量折叠
- 代数简化
- 公共子表达式消除
阶段三:LIR 生成
将 HIR 转换为低级中间表示(LIR):
阶段四:LIR 优化
在 LIR 层面进行低层次优化:
- 寄存器分配
- 指令调度
- 基本块重排序
C1 与 C2 的区别
C1 编译器参数
C1 的优化策略
C1 编译器主要进行以下优化:
1. 基本块重排序
2. 窥孔优化
3. 冗余加载消除
4. 简单内联
C1 会进行简单的内联优化:
C1 的使用场景
C1 编译器适合以下场景:
- 短生命周期应用:命令行工具、一次性脚本
- 对启动时间敏感:GUI 应用、服务启动
- 不需要极致性能:辅助工具、调试程序
禁用 C1
在某些情况下,可能需要禁用 C1:
性能监控
观察 C1 编译
编译计数器
C1 与分层编译
在分层编译模式下,C1 的角色:
C1 在分层编译中的价值:
- 提供快速的首层编译
- 采集 profiling 数据
- 快速响应热点代码