JDK 26新特性:HTTP/3、G1性能提升、AOT支持ZGC、Final警告

Java 26进入rampdown阶段1,这将使其特性集成为石头:HTTP/3支持,性能和AOT改进,新的命令行标志来管理最终字段变化,等等

Java 26 全新特性大揭秘!HTTP/3、G1 性能飞跃、AOT 缓存全兼容,还有 Final 字段反射即将被封杀!

JDK 26 正式进入 Dampdown Phase 1,这意味着它的功能特性已经冻结,再也不会有新的特性加入了。

而这次 Java 26 带来的更新,真的可以说是既重磅又实用,从网络协议支持到垃圾回收优化,从安全性加固到开发体验提升,每一项都直击开发者痛点!尤其是那些还在用旧版 Java 写高并发服务的兄弟们,你们真的不能再等了!

这篇文章我将带你逐个拆解 JDK 26 的所有核心特性,包括 HTTP/3 原生支持、G1 垃圾回收器性能大提升、AOT 缓存支持任意 GC、Applet API 彻底移除、Final 字段反射警告上线、原始类型模式匹配、PEM 文本处理简化、懒加载常量(Stable Values)第二轮预览、结构化并发 API 优化……每一项我都给你讲透,保证你看完就想立刻升级!
 

HTTP/3 原生支持来了!Java 终于拥抱下一代网络协议

从 JDK 26 开始,Java 的 HttpClient 终于原生支持 HTTP/3 协议了!这意味着你再也不用依赖第三方库去实现基于 QUIC 的高性能连接。具体用法超级简单,只需要在构建 HttpClient 或 HttpRequest 时,把版本指定为 HttpClient.Version.HTTP_3 就行了。看代码:

var client = HttpClient
    .newBuilder()
    .version(HttpClient.Version.HTTP_3)
    .build();

var request = HttpRequest
    .newBuilder(
        URI.create("https://openjdk.org/  "))
    .version(HttpClient.Version.HTTP_3)
    .GET().build();

var response = client
    .send(request, BodyHandlers.ofString());

是不是超简洁?但注意啊,HTTP/3 和 HTTP/1.1、HTTP/2 有本质区别——它跑在 UDP 上,而不是 TCP!这就意味着你无法像以前那样“升级”现有连接,必须从头建立新连接。也正因为如此,Java 团队在 JEP 517 中详细说明了如何在 API 层面处理这个协议切换的复杂逻辑,包括连接复用、版本协商等细节。

如果你正在构建低延迟、高吞吐的 Web 服务,比如实时通信、在线游戏后端或者金融交易系统,HTTP/3 的引入将带来显著的性能提升。建议立刻去读 JEP 517,搞懂它的权衡取舍,别等上线出问题才后悔!


  

G1 垃圾回收器性能暴增!吞吐量最高提升 15%

说到性能优化,JDK 26 这次在垃圾回收方面也放了个大招!

默认的 G1 垃圾回收器(Garbage-First GC)在 JDK 26 中通过 JEP 522 实现了显著的吞吐量提升,最高可达 15%!

这是怎么做到的?简单说,就是优化了“卡表”(Card Table)这个关键数据结构的并发访问机制。
G1 是一种分区式垃圾回收器,它需要频繁追踪对象引用的变化,而这些变化记录在卡表中。
以前,多个线程同时修改对象引用字段时,会因卡表争用而产生严重锁竞争,导致 CPU 浪费。
现在,JDK 26 通过减少同步开销和优化写屏障(Write Barrier)与 JIT 编译器的协作,大幅降低了这种竞争。

实际收益取决于你的应用特性——如果你的应用频繁修改对象引用(比如大量集合操作、图结构遍历),那你几乎一定能感受到启动更快、响应更稳、CPU 占用更低!
  

AOT 缓存终于支持 ZGC!任意垃圾回收器都能加速启动

Project Leyden(利顿项目)是 Oracle 为 Java 启动性能提速的秘密武器,而 AOT(Ahead-of-Time)缓存正是其中的关键一环。

在 JDK 26 之前,AOT 缓存只能用于 Serial GC、Parallel GC 和 G1,却偏偏不支持现代高性能的 ZGC!
为什么?
因为缓存格式是 GC 特定的,ZGC 的内存布局和其他 GC 完全不同。

现在,JEP 516 引入了“GC 无关的缓存格式”,终于让 ZGC 也能享受 AOT 缓存的红利!虽然这种新格式不能直接内存映射(mmap),而是通过后台线程流式加载,但好处是:即使缓存文件不在文件系统缓存中,整体启动速度也可能更快!而且,你可以通过 -XX:+AOTStreamableObjects 或 -XX:-AOTStreamableObjects 手动选择格式。

更妙的是,JDK 26 还内置了智能启发式算法,自动判断何时用哪种格式。如果你的应用启动时间是关键指标(比如 Serverless 函数、微服务冷启动),那这个特性绝对值得你深入研究!

  

Applet API 彻底移除!Java 正式告别 90 年代的“老古董”

还记得 Java Applet 吗?那个曾经和 JavaScript 争天下、嵌在网页里跑 Java 字节码的小程序?

如今,它终于在 JDK 26 中被彻底移除了!java.applet 包从此消失,这是 Java 自诞生以来首次没有内置 Applet 支持。其实早在 JDK 9 时,Applet 就被标记为废弃,因为现代浏览器早已禁用插件(如 NPAPI),Applet 也几乎无人使用。这次移除,不仅清理了历史包袱,也让 JDK 代码库更轻量、更安全。

正如 Brian Goetz(Java 语言架构师)所说,Java 早期很多“错误”的设计(比如默认可空引用、默认可继承类)其实是当时成功的必要条件。Applet 就是其中之一——它曾是 Java “一次编写,到处运行”理念的最佳广告。但时代变了,JavaScript 赢了,Java 也该优雅谢幕。如果你还在维护遗留的 Applet 系统……兄弟,真的该重构了。

  

反射修改 Final 字段?JDK 26 开始警告,未来直接抛异常!

Java 的 final 关键字本意是“不可变”,但反射 API 却一直能绕过它,悄悄修改 final 字段的值!这在很多框架(比如某些 ORM、序列化库)中被滥用,导致程序行为不可预测、JIT 优化失效,甚至安全漏洞。

从 JDK 26 开始,这种操作将触发警告!虽然默认行为仍是允许修改(--illegal-final-field-mutation=warn),但每修改一次,JVM 就会打印一条警告。你还可以用 --illegal-final-field-mutation=debug 查看详细堆栈,或者用 deny 模式提前测试未来行为(直接抛 IllegalAccessException)。

更重要的是,未来某个版本将默认禁止此操作,除非你显式启用 --enable-final-field-mutation。如果你的项目依赖反射修改 final 字段,请立刻检查!

这是 Java 向“真正不可变”迈出的关键一步!

  

原始类型模式匹配:int 能装下这个 long 吗?现在一问便知!

模式匹配(Pattern Matching)是 Java 近年最火的语言特性之一,而 JDK 26 将它扩展到了原始类型(Primitive Types)!现在你可以用 instanceof 或 switch 直接判断一个 long 值是否能“无损”转换为 int、float 等类型。比如:

long l = // ...

if (l instanceof float f) {
    
// 如果 l 能无损表示为 float,则 f 就是那个值
}

switch (jsonNode) {
    case JsonNumberNode(int n) ->
// 如果 JSON 数字能转为 int
    case ...
}

这背后其实是个复杂的 8x8 类型转换矩阵,涉及范围、精度、舍入等细节。JDK 26 还修复了一个坑:以前如果你写 switch (byte x) { case short s: ... case 42: ... },当 x=42 时,会匹配到 case short s(因为 42 是 short),导致 case 42 永远不会执行。现在,编译器会直接报错“不可达代码”!这项特性目前仍是第四轮预览(JEP 530),但离正式落地不远了。如果你在做数据解析、协议转换或类型安全的 DSL,原始类型模式将极大简化你的代码!

  

PEM 文本处理终于有官方 API 了!密钥证书一键编解码

在加密通信中,PEM(Privacy-Enhanced Mail)格式是交换公钥、私钥、证书的通用文本格式,长这样:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj
0DAQcDQgAEi/kRGOL7wCPTN4KJ
2ppeSt5UYB6ucPjjuKDtFTXbgu
OIFDdZ65O/8HTUqS/sVzRF+dg7
H3/tkQ/36KdtuADbwQ==
-----END PUBLIC KEY-----

以前,Java 虽然有底层 API(如 Base64、ASN.1 解析),但要手写大量胶水代码才能把 PEM 字符串转成 X509Certificate 或 PrivateKey。从 JDK 25 开始预览、JDK 26 第二轮预览的 JEP 524,终于提供了 PEMEncoder 和 PEMDecoder!用法超简单:

X509Certificate cert = // ...

var pe = PEMEncoder.of();
var pemString = pe.encodeToString(cert);

var pd = PEMDecoder.of();
X509Certificate cert2 = pd.decode(pemString, X509Certificate.class);

甚至支持加密私钥(用密码保护)!这不仅简化了开发,还提高了安全性(官方实现更可靠)。如果你在做 TLS、JWT、OAuth2 或区块链相关开发,这个 API 将节省你无数调试时间!

  

懒加载常量(Lazy Constants)第二轮预览:名字都换了!

JDK 25 引入的“稳定值”(Stable Values)API,在 JDK 26 中改名为“懒加载常量”(Lazy Constants)并进入第二轮预览(JEP 526)。核心功能不变:提供线程安全、一次初始化、高性能的懒加载机制。但整个 API 表面大改,类名、方法名、包结构几乎全换。

如果你在做高性能缓存、配置加载或单例初始化,这个特性未来将成为标准工具。现在就可以在预览模式下试用,为正式版做准备!

  

结构化并发再优化:超时处理、结果返回更合理!

结构化并发(Structured Concurrency)是 Java 为简化多线程编程推出的革命性 API。JDK 25 对它进行了大重构,JDK 26 则在细节上继续打磨。

比如 Joiner 接口现在支持 onTimeout 方法,让你在任务超时时执行清理逻辑并自定义异常;
allSuccessfulOrThrow() 现在直接返回结果列表,而不是子任务流;anySuccessfulResultOrThrow() 也简化为 anySuccessfulOrThrow()。

这些改动看似微小,却极大提升了 API 的易用性和一致性。如果你厌倦了 CompletableFuture 的回调地狱,结构化并发绝对值得你尝试!记得在预览模式下测试并反馈给 OpenJDK 社区,加速它正式落地!

  

Vector API 变动中”

Vector API可能是因为它太复杂,或者还在剧烈变动中。但无论如何,这说明 Vector API 仍是高度实验性的特性,普通开发者暂时不必深究。

 

总结:JDK 26 不只是新特性,更是 Java 未来的方向标

JDK 26 虽然没有语法层面的爆炸性更新,但它在性能、安全、现代化和开发者体验上的进步,却是实打实的。

HTTP/3 让 Java 服务拥抱下一代网络;G1 和 AOT 缓存优化启动与吞吐;Final 字段加固提升程序可靠性;PEM API 简化安全开发;结构化并发和模式匹配让代码更简洁……每一项都在默默推动 Java 向更高效、更安全、更现代的方向演进。

作为开发者,我们不仅要会用,更要理解背后的设计哲学。升级 JDK 26,不是为了追新,而是为了构建更健壮、更高效的系统!