文章 · 2026-03-18

Java 26:承上启下的版本迭代

Java 26 如期而至。虽然不是颠覆性的语言级变革,但体现了严谨工程师的风范——专注于性能优化、现代化改造以及为 Project Valhalla 铺平道路。

本次更新涵盖 10 个 JEP(JDK Enhancement Proposal):4 个正式特性、5 个预览特性、1 个弃用信号。让我们逐一审视。

正式特性

JEP 516:Ahead-of-Time Object Caching with Any GC

问题: Java 24 引入的 AOT 对象缓存被特定 GC 束缚,无法用于 ZGC、堆大于 32GB,或禁用压缩对象指针的场景。

方案: 新设计放弃硬编码的内存地址,改用逻辑索引系统。这层抽象解耦了缓存与 GC 的内存布局,实现通用性。使用 ZGC、大堆或 -XX:-UseCompressedOops 时自动启用,也可通过 -XX:+AOTStreamableObjects 强制启用。

意义: 对追求极致启动速度的应用(Serverless、CLI 工具)而言,AOT 缓存至关重要。JEP 516 将其优势从 G1 和 Parallel GC 扩展至所有现代收集器,提升 Java 在云原生领域的竞争力。

JEP 522:G1 GC——Improve Throughput by Reducing Synchronization

收益: 直接的性能提升——引用密集型应用吞吐量提升 5–15%,x64 架构上因寄存器压力减小额外提升约 5%。代价:每 GB 堆增加约 2MB(0.2%)的额外开销。

原理: G1 用 Card Table 跟踪并发标记阶段需要处理的内存区域。应用线程和 GC 线程原本争用同一个表,产生同步瓶颈。JEP 522 引入第二个表:应用线程写入其一,GC 线程处理其二,从而避免直接冲突。

意义: G1 作为默认 GC,其性能提升惠及海量应用。开发者无需修改代码,仅需升级 JDK。

JEP 517:HTTP/3 for the HTTP Client API

为什么: HTTP/3(基于 QUIC 协议)消除了队头阻塞问题,连接建立更快,在不稳定网络中表现更佳。约三分之一的网站已支持 HTTP/3。

如何使用: 需显式选择 HTTP/3。四种协议协商策略可用:

// 需要显式请求 HTTP/3
HttpClient client = HttpClient.newBuilder()
        .version(HttpClient.Version.HTTP_3)
        .build();

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://example.com"))
        .build();

// 客户端会尝试通过 ALPN 或 HTTPS 记录来协商 HTTP/3
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println("Response protocol version: " + response.version());

意义: 标准库现在提供开箱即用的 HTTP/3 支持。对于普通应用和希望减少外部依赖的团队而言,这很重要。

JEP 504:Remove the Applet API

浏览器 Java 时代的遗迹——Applet API 已被移除。java.applet 包、java.beans.AppletInitializerjavax.swing.JApplet 都已删除。

意义: 对大多数开发者无影响。仅在维护遗留代码时才会涉及。

预览特性

JEP 530:Primitive Types in Patterns, instanceof, and switch(Fourth Preview)

模式匹配现可直接用于 intdoubleboolean 等原始类型,不再局限于引用类型。

// 预览功能,需要 --enable-preview
static String formatPrimitive(Object obj) {
    return switch (obj) {
        // 直接匹配原始类型!
        case int i    -> String.format("int %d", i);
        case long l   -> String.format("long %d", l);
        case double d -> String.format("double %f", d);
        case String s -> String.format("String %s", s);
        default       -> obj.toString();
    };
}

// instanceof 也支持原始类型
if (roomSize instanceof byte r) {
    System.out.println("Room size fits in a byte: " + r);
}

补全了模式匹配的关键一环,处理混合类型数据(解析 JSON、处理数据库记录)时表达能力大幅增强。

JEP 525:Structured Concurrency(Sixth Preview)

核心原则: 若任务分裂为子任务,必须等待所有子任务完成才能继续。这建立清晰的父子层级,杜绝线程泄漏,简化错误处理和取消操作。

本轮新增: onTimeout() 方法;allSuccessfulOrThrow() 返回 List 而非 Stream

// 预览功能,需要 --enable-preview
void handleOrder() throws InterruptedException, ExecutionException, TimeoutException {
    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        Future<String> userFuture  = scope.fork(this::findUser);
        Future<Integer> orderFuture = scope.fork(this::fetchOrder);

        scope.joinUntil(Instant.now().plusSeconds(5));
        scope.throwIfFailed();

        String user = userFuture.resultNow();
        int order = orderFuture.resultNow();
        System.out.println("Order " + order + " for user " + user);
    }
}

结构化并发是自 java.util.concurrent 以来 Java 并发领域最重要的演进。它从根本上改变思考方式:从"管理线程"转向"管理任务"。六轮预览体现了这类变更所需的谨慎;最终形态已近在咫尺。

JEP 526:Lazy Constants(Second Preview)

定义延迟初始化、不可变值的标准、安全、高效方式。新的 LazyConstant<T> 类保证即使并发访问也仅初始化一次,且不允许 null 作为计算值。还支持 List.ofLazy()Map.ofLazy() 等工厂方法。

经典的"延迟初始化单例"模式充满陷阱(线程安全、双重检查锁定失效)。Lazy Constants 将这一常见、容易出错的设计提升为简单、可靠的语言构件——对编写高性能、健壮的库和框架特别有价值。

其他预览/孵化特性

JEP 524:PEM-Encoded Cryptographic Objects(Second Preview) 提供解析和生成 PEM 格式密钥与证书的标准 API(PEMEncoderPEMDecoderPEM record),减少对 Bouncy Castle 等第三方库的依赖。

JEP 529:Vector API(Eleventh Incubator) 利用 CPU SIMD 指令加速向量化计算,是 Java 在高性能计算和机器学习领域的关键。最终形态取决于 Project Valhalla 的进展;本轮无变化。

值得关注的弃用

JEP 500:让 final 真正成为 final

内容: 代码通过反射修改 final 字段时,JDK 发出警告。

原因: final 关键字保证字段不可变。JVM 和 JIT 编译器基于此优化。通过反射打破这一契约会导致诡异行为且阻碍未来优化。

时间线: 目前仅是警告。未来 Java 版本中可能抛出 IllegalAccessException。依赖此技巧的框架(如旧版序列化库)需尽快调整。可通过 --enable-final-field-mutation=module1,module2 按模块显式允许。

意义: 加强语义一致性,为 JIT 开启更大优化空间。开发者应现在审计代码库,消除不安全的反射。

展望

Java 26 是典型的承上启下版本。它将 AOT 缓存、G1 GC 优化、HTTP/3 支持正式交付,提升现有应用的性能与现代化水平。它通过多轮预览持续打磨结构化并发和模式匹配等重量级特性,它们将重塑 Java 编程范式。

更重要的是,我们能清晰地看到 Project Valhalla 的身影。无论是漫长孵化的 Vector API,还是新颖的 Lazy Constants,它们都在等待 Valhalla 的值类型(Value Types)和原始对象(Primitive Objects)来释放全部潜力。Valhalla 将是继泛型之后 Java 平台最深刻的变革。Java 26 的许多特性正为这场变革铺设基础。

升级到 Java 26 是平滑的进步。你既能获得免费的性能提升和现代化网络支持,又能提前体验将定义下一代 Java 编程的强大功能。

参考

© 2026 Yuxu Ge ·