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.AppletInitializer 和 javax.swing.JApplet 都已删除。
意义: 对大多数开发者无影响。仅在维护遗留代码时才会涉及。
预览特性
JEP 530:Primitive Types in Patterns, instanceof, and switch(Fourth Preview)
模式匹配现可直接用于 int、double、boolean 等原始类型,不再局限于引用类型。
// 预览功能,需要 --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(PEMEncoder、PEMDecoder、PEM 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 编程的强大功能。
参考
- Java 26 is here! — Hanno's Blog