You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:42:24