为何OpenJDK 11的C2编译器未对Optional执行逃逸分析?
为什么启用逃逸分析后,OpenJDK 11的C2编译器仍会因Optional触发Young GC?
我正在OpenJDK 11的C2服务器编译器中做实验。之前看了一篇博客,好奇方法内使用Optional类是否不会产生对象分配,于是写了如下代码测试:
import java.util.Optional; public class Hello{ public static void main(String[] argc){ long sum = 0; for(int i =0;i<10000000;i++){ sum+=(compute(i %2 == 0 ? "1":null)); } System.out.println(sum); } static int compute(final String obj){ // Optional.ofNullable internally creates an instance of Optional return Optional.ofNullable(obj).map(String::length).orElse(2); } }
我的Java版本信息:
openjdk 11.0.17 2022-10-18 LTS OpenJDK Runtime Environment Corretto-11.0.17.8.1 (build 11.0.17+8-LTS) OpenJDK 64-Bit Server VM Corretto-11.0.17.8.1 (build 11.0.17+8-LTS, mixed mode, sharing)
先禁用逃逸分析运行,命令如下:
java -server \ -verbose:gc \ -XX:-DoEscapeAnalysis Hello
得到预期的Young GC输出:
[0.031s][info][gc] Using G1 [0.071s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 24M->1M(248M) 3.192ms 15000000
但启用逃逸分析(添加-XX:+DoEscapeAnalysis参数)后,JVM还是触发了Young GC,运行命令和输出如下:
java -server \ -verbose:gc \ -XX:+DoEscapeAnalysis Hello
[0.032s][info][gc] Using G1 [0.072s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 24M->1M(248M) 3.201ms 15000000
想知道这一现象的原因,感谢解答!
内容的提问来源于stack exchange,提问作者Almas Abdrazak
相关产品推荐
相关产品推荐

