JIT是Just-In-Time的缩写,是Java虚拟机把字节码的再编译为本地代码的编译器的名称。我为什么突然想写这个呢?因为国内对JIT的研究非常少,而且面试也问得少,但是我认为JIT对虚拟机特别重要,因为对性能的提升非常明显。java虚拟机使用的是jvm指令集,而底层机器有自己的指令集,指令集的差异使得这个“翻译”过程非常耗费性能。对于这个问题,在JIT之前,java曾经有AOT(Ahead-Of-Time),这种编译器是将字节码bytecode提前编译为机器代码。AOT被淘汰的原因是统计发现80%的bytecode只执行一次,那么全部编译为机器代码,就没有必要了。对于只执行一次的代码,解释器性能更好,因为编译为本地代码开销比较大。
我这个子专栏专讲JIT优化。主要分为以下67种优化技术,后面的星号表示面试被问概率,星号越多被问概率越大:
编译策略compiler tactics
- Delayed compilation⭐⭐⭐⭐⭐
- Tiered compilation⭐⭐⭐⭐⭐
- On-stack replacement⭐⭐⭐⭐⭐
- delayed reoptimization⭐⭐
- program dependence graph rep.⭐
- static single assignment rep.⭐⭐⭐
proof-based techniques - exact type inference⭐
- memory value inference⭐
- memory value tracking⭐
- constant folding⭐
- reassociation⭐
- operator strength reduction⭐
- null check elimination⭐⭐⭐⭐
- type test strength reduction⭐
- type test elimination⭐⭐
- algebraic simplification⭐
- common subexpression elimination⭐
- integer range typing⭐
flow-sensitive rewrites - conditional constant propagation⭐
- dominating test detection⭐
- flow-carried type narrowing⭐
- dead code elimination⭐
language-specific techniques - class hierarchy analysis⭐
- devirtualization⭐
- symbolic constant propagation⭐
- autobox elimination⭐
- escape analysis⭐⭐⭐⭐⭐
- lock elision⭐⭐⭐⭐⭐
- lock fusion⭐⭐⭐⭐⭐
- de-reflection⭐
speculative (profile-based) techniques - optimistic nullness assertions⭐
- optimistic type assertions⭐
- optimistic type strengthening⭐
- optimistic array length strengthening⭐
- untaken branch pruning⭐
- optimistic N-morphic inlining⭐
- branch frequency prediction⭐
- call frequency prediction⭐
memory and placement transformation - expression hoisting⭐
- expression sinking⭐
- redundant store elimination⭐
- adjacent store fusion⭐
- card-mark elimination⭐
- merge-point splitting⭐
loop transformations - loop unrolling⭐
- loop peeling⭐
- safepoint elimination⭐
- iteration range splitting⭐
- range check elimination⭐
- loop vectorization⭐
global code shaping - inlining (graph integration)⭐⭐
- global code motion⭐
- heat-based code layout⭐
- switch balancing⭐
- throw inlining⭐
control flow graph transformation - local code scheduling⭐
- local code bundling⭐
- delay slot filling⭐
- graph-coloring register allocation⭐
- linear scan register allocation⭐
- live range splitting⭐
- copy coalescing⭐
- constant splitting⭐
- copy removal⭐
- address mode matching⭐
- instruction peepholing⭐
- DFA-based code generator⭐
总结下,面试最热门问题是:
1. 延迟编译
2. 分层编译
3. 栈上替换
4. 逃逸分析
5. 锁消除
6. 锁粗化
除这六种优化外,其余61种优化,面试几乎不会问到。