Graal 是用 Java 写成、可以替换 C2 的 JIT 编译器。这篇在同一个 JDK 上只切换编译器,量出它的逃逸分析、稳态吞吐、预热曲线和内存成本,并如实记录一个预期没有出现的优化。
[C1(TieredStopAtLevel=1)] UseJVMCICompiler = false, EnableJVMCI = true, UseJVMCINativeLibrary = true, TieredStopAtLevel = 1 [C2] UseJVMCICompiler = false, EnableJVMCI = true, UseJVMCINativeLibrary = true, TieredStopAtLevel = 4 [Graal JIT(默认)] UseJVMCICompiler = true, EnableJVMCI = true, UseJVMCINativeLibrary = true, TieredStopAtLevel = 4
v1:对象在罕见分支(约每 100 万次一次)里存入普通静态字段,分支之后还读 p.x、p.y;v2:同样但存入 volatile 静态字段;v3:分支条件永远不成立(i == -5);v4:罕见分支存入另一个静态字段 holder,之后还读 p;v5:罕见分支里逃逸的是另一个新对象,p 本身不逃逸;v6:先读完 p.x + p.y,罕见分支里再把 p 存入静态字段,分支之后不再用 p [C2] v1 23.86 字节; v2 24.00 字节; v3 0.00 字节; v4 24.00 字节; v5 0.00 字节; v6 24.00 字节 [Graal JIT(默认)] v1 24.00 字节; v2 24.00 字节; v3 0.00 字节; v4 24.00 字节; v5 0.00 字节; v6 24.00 字节 [Graal JIT + -Djdk.graal.PartialEscapeAnalysis=false] v1 24.00 字节; v2 24.00 字节; v3 24.00 字节; v4 24.00 字节; v5 24.00 字节; v6 24.00 字节 [C1(TieredStopAtLevel=1)] v1 24.00 字节; v2 24.00 字节; v3 24.00 字节; v4 24.00 字节; v5 24.00 字节; v6 24.00 字节
[C1(TieredStopAtLevel=1)]
stream 每毫秒 188.7 次(中位数;最小 182.5 最大 189.6)
poly3 每毫秒 328.1 次(中位数;最小 327.8 最大 328.2)
poly2 每毫秒 384.7 次(中位数;最小 382.4 最大 385.0)
string 每毫秒 148.6 次(中位数;最小 148.5 最大 148.8)
hash 每毫秒 148.5 次(中位数;最小 148.2 最大 148.6)
[C2]
stream 每毫秒 857.8 次(中位数;最小 848.7 最大 866.0)
poly3 每毫秒 339.6 次(中位数;最小 338.3 最大 341.8)
poly2 每毫秒 1386.5 次(中位数;最小 1385.2 最大 1387.2)
string 每毫秒 409.8 次(中位数;最小 408.3 最大 414.4)
hash 每毫秒 250.1 次(中位数;最小 249.6 最大 250.6)
[Graal JIT(默认)]
stream 每毫秒 654.3 次(中位数;最小 645.1 最大 685.5)
poly3 每毫秒 353.9 次(中位数;最小 353.7 最大 354.0)
poly2 每毫秒 423.9 次(中位数;最小 423.8 最大 423.9)
string 每毫秒 167.1 次(中位数;最小 147.0 最大 179.9)
hash 每毫秒 231.7 次(中位数;最小 227.5 最大 232.7)[C1(TieredStopAtLevel=1)] 第 1 批 112.2 ms,第 2 批 108.4,第 5 批 108.9,第 10 批 108.4,第 20 批 108.7,第 40 批 108.3;前 40 批合计 4345 ms [C2] 第 1 批 35.2 ms,第 2 批 25.4,第 5 批 25.1,第 10 批 24.0,第 20 批 24.6,第 40 批 23.5;前 40 批合计 984 ms [Graal JIT(默认)] 第 1 批 43.8 ms,第 2 批 30.7,第 5 批 30.1,第 10 批 30.9,第 20 批 31.3,第 40 批 31.0;前 40 批合计 1246 ms
[C1(TieredStopAtLevel=1)] 6 秒内完成 1,104,000 次;峰值常驻内存 195 MiB;real 6.05 s,user 6.03 s,sys 0.04 s [C2] 6 秒内完成 5,116,000 次;峰值常驻内存 205 MiB;real 6.04 s,user 6.10 s,sys 0.03 s [Graal JIT(默认)] 6 秒内完成 3,950,000 次;峰值常驻内存 250 MiB;real 6.05 s,user 6.11 s,sys 0.04 s