JIT 编译器概述
理解 JIT 编译器的工作原理,是进行 JVM 性能优化的基础。
为什么需要 JIT
解释执行的瓶颈
纯解释执行存在严重的性能问题:
JIT 的解决方案
JIT 编译器通过以下方式解决解释执行的性能问题:
JIT vs AOT
JIT 和 AOT 是两种不同的编译策略:
JIT 编译时机
JIT 编译器不会一上来就编译所有代码,而是只编译「热点代码」。
热点代码探测
JVM 通过两个计数器来探测热点代码:
编译阈值
编译阈值可以通过参数调整:
分层编译
现代 JVM 采用分层编译策略,平衡编译速度和优化程度:
各层职责
JIT 编译器类型
C1 编译器(Client Compiler)
C1 编译器特点:
- 编译速度快
- 优化激进程度低
- 适合客户端应用
C2 编译器(Server Compiler)
C2 编译器特点:
- 编译速度慢
- 优化激进程度高
- 适合服务端应用
JIT 优化概述
JIT 编译器会进行多种优化:
常见优化
JIT 日志
开启 JIT 日志
JIT 日志格式
分析 JIT 日志
JIT 的限制
JIT 编译器不是万能的:
- 预热时间:需要运行一段时间才能达到峰值性能
- 编译开销:编译本身消耗 CPU 和内存
- 代码缓存:编译后的代码占用 Code Cache
- 去优化:假设不成立时需要回退