Ohhnews

分类导航

$ cd ..
Baeldung原文

Java 26新特性介绍

#java 26#性能优化#垃圾回收#http/3#结构化并发

1. 引言

Oracle 于三月发布了 Java 26,带来了诸多实用特性,包括性能提升、新 API 以及可能在后续版本中成为永久特性的预览功能。本次发布主要聚焦于垃圾回收、网络通信、启动性能、加密以及其他语言特性方面的改进。

本教程将简要介绍 Java 26 引入的所有关键特性。

2. 限制对 final 字段的反射修改

我们创建 final 变量 是为了确保开发者其值在初始化后无法更改,这有助于创建不可变对象并帮助 JVM 执行某些优化。然而,通过反射可以突破这一限制。

有些库和框架使用反射在对象创建后修改 final 字段。 这会破坏开发者所做的假设,JVM 优化也可能不再有效。

从 Java 26 开始,平台向着更强的封装性和完整性迈出了新的一步。当代码尝试使用深层反射修改 final 字段时,JVM 会显示警告,提示开发者该操作依赖于一种正在被淘汰的行为。尽管目前尚未强制执行,但方向是明确的:未来 Java 版本预计会施加更严格的限制。

这将影响某些序列化库、依赖注入框架、模拟工具以及绕过构造器填充对象状态的遗留代码。

开发者现在应开始审计并识别对 final 字段的反射写入操作,迁移到支持的替代方案,如构造器、构建器、工厂方法或记录(records),或者使用框架提供的专为不可变对象设计的 API。

3. 移除 Applet API

Applet 过去用于在浏览器中运行 Java 应用程序。然而,由于性能、兼容性和安全问题,现代浏览器不再支持 Applet。这被认为是一项过时的技术,自 Java 9 起该 API 已被标记为弃用。如今,开发者使用更好的替代方案,如 Swing/JavaFX 来实现 UI。

在 Java 26 中,Applet API 已不复存在。这一更新有助于 Oracle 保持 Java 的精简和安全,同时减少维护负担。其移除仅会影响那些仍然依赖它的旧版遗留应用程序。

4. 支持任意 GC 的提前对象缓存

Java 以构建分布式云原生应用而闻名,这些应用频繁部署、扩缩、启动和停止。Oracle 正致力于提升启动性能,使应用能更快达到峰值性能。Java 26 引入了这一增强。

Java 具有提前(AOT)对象缓存功能,它能识别启动过程中创建代价高昂的对象并将其存储在缓存中。当应用再次启动时,这些对象直接从缓存加载,而无需重新创建,从而降低启动开销。

AOT 的优势此前仅限于特定的 GC 配置。然而在 Java 26 中,该特性对任何垃圾收集器都可用,包括低延迟收集器(如 ZGC)。

这一增强允许开发者在享受 AOT 对象缓存优势的同时,保留他们偏好的垃圾收集器。

5. HTTP 客户端 API 支持 HTTP/3

对于微服务、实时应用和云原生服务等频繁通过网络通信的应用而言,网络韧性和延迟是关键因素。Java 26 中,HTTP 客户端 API 现已支持 HTTP/3,这是 HTTP 协议的最新版本。

HTTP/1.1 和 HTTP/2 基于 TCP,而 HTTP/3 使用 QUIC 传输协议,运行在 UDP 上,解决了 TCP 协议的一些局限。在 TCP 中,一个数据包丢失可能导致共享同一连接的所有流延迟,而 QUIC 允许流独立进行。QUIC 通过合并传输和安全握手,减少了数据开始流动前所需的网络往返次数。

另一个实际优势是自动协议协商。 如果目标服务器支持 HTTP/3,客户端可以使用它;如果不支持,则可以无缝回退到 HTTP/2 或 HTTP/1.1,确保与现有基础设施的兼容性。

通过引入 HTTP/3,应用现在可以体验到更低的延迟和更高的响应性,这对实时和云原生应用尤其有用。

下面来看一个简单示例:

$ java
@Test
void givenHttp3Client_whenSendingARequest_thenShouldReceiveSuccessfulResponse()
    throws IOException, InterruptedException {
    HttpClient client = HttpClient.newBuilder()
      .version(HttpClient.Version.HTTP_3)
      .build();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://example.com"))
      .GET()
      .build();
    HttpResponse<String> response =
      client.send(request, HttpResponse.BodyHandlers.ofString());
    assertEquals(200, response.statusCode());
}

要使用 HTTP/3,我们在构建客户端时指定 HttpClient.Version.HTTP_3。然后创建一个简单的 GET 请求到 https://example.com,并使用 send() 方法同步发送。最后,我们通过断言响应状态码为 200 来验证请求成功完成。

值得注意的是,将客户端配置为 HTTP/3 并不能保证连接一定会使用 HTTP/3。如果目标服务器不支持 HTTP/3,客户端会自动回退到较早的 HTTP 版本(HTTP/2 或 HTTP/1.1),同时仍能成功完成请求。

6. G1 垃圾收集器吞吐量提升

长期以来,G1(Garbage First)垃圾收集器一直是 Java 的默认 垃圾收集器。它在吞吐量、内存和暂停时间可预测性之间提供了出色的平衡。

典型的现代 Java 应用会不断创建或更新对象引用。G1 负责跟踪对象引用的变化以执行垃圾收集。最终,这种跟踪存在一定的开销,尤其是在分配率高或对象更新频繁的应用中。

在 Java 26 中,G1 进行了一系列内部更改,以提升应用吞吐量。其中一项更改是减少了应用程序线程和垃圾回收(GC)线程在跟踪哪些对象引用被更改时所需的同步。 由于这些改进,应用程序线程在 GC 相关操作上同步等待的时间将减少,从而有更多时间执行应用逻辑。

7. 加密对象的 PEM 编码(第二预览版)

处理安全性的应用通常需要处理证书、公钥和私钥以及证书链。加密对象通常使用 PEM(Privacy Enhanced Mail)格式存储和传输。 PEM 是一种基于文本的格式,可以紧凑地格式化二进制安全数据。

Java 开发者历来需要部署第三方库或自行编写代码来读写 PEM 文件。这增加了安全相关应用的复杂性和繁琐性,因为引入了额外的依赖和几乎无用的代码。

Java 26 引入了加密对象的 PEM 格式新 API 的第二个预览版,为 Java SE 增加了相应能力。使用提议的 API,Java 开发者可以使用标准 Java SDK 读写证书和密钥,而无需使用第三方库。

该提议的 API 增强了 Java 与标准安全协议和基础设施的集成能力,简化了证书和密钥的管理。此外,该 API 减少了为应用编写自定义代码的时间和精力。尽管仍处于预览阶段,但它为 Java 安全提供了一种更一致、更实用的方法。

8. 结构化并发(第六预览版)

结构化并发 是 Project Loom 工具集的一部分,通过将多个相关任务视为一个工作单元,简化了 Java 中的并发编程,无需开发者单独管理多个线程。

在传统并发代码中,协调线程、处理故障和清理资源可能变得复杂。结构化并发允许相关任务在定义的范围内运行,如果一个任务失败,其他相关任务将自动取消。 这有助于避免浪费工作。

Java 26 包含了结构化并发的第六个预览版,基于实际使用和社区反馈进行了进一步改进,该特性正在向成为平台永久特性迈进。

9. 惰性常量(第二预览版)

在正常情况下,类常量在类加载时创建,即使应用从未使用它们。这会导致启动时间增加并创建不必要的对象。

为了解决这个问题,开发者过去常常引入自己的代码,仅在常量实际需要时才创建它们。这些代码通常复杂、可读性差且难以维护。

通过惰性常量,这一机制现已内置。开发者可以在不引入复杂代码的情况下享受惰性加载的好处。 通过仅在首次使用时创建对象,应用可以更快启动并使用更少的资源。Java 26 包含了该特性的第二个预览版。

10. 向量 API(第十一孵化器)

Java 26 中的向量 API 是一项孵化器特性,允许开发者利用 SIMD(单指令多数据流)。

通常,处理器一次对一个值执行操作。使用 SIMD,可以在一次操作中对多个值执行相同操作。这有助于应用在保持跨不同 CPU 架构可移植性的同时,获得接近原生代码的性能。

这将显著提升计算密集型工作负载的性能,例如科学计算、数据分析、图像处理、机器学习和金融计算。

11. 模式、instanceofswitch 中的原始类型(第四预览版)

模式匹配使代码更易读,并减少了手动类型检查和转换的需要。在之前的版本中,模式匹配仅支持引用类型。

然而在 Java 26 中,它也包含了原始类型,如 intlongfloatdouble 这允许开发者在模式匹配结构(包括 switch 语句和其他基于模式的控制流)中更自然地使用原始值。

12. 结论

我们看到了 Java 26 引入的各种改进和新特性。虽然它们混合了永久特性和预览特性,但很明显,Java 社区正在努力使 Java 成为现代企业应用开发的理想选择。

示例的源代码可以在 GitHub 上找到。