JDK 17 是一个 长期支持(LTS) 版本,意味着它将获得多年更新和支持。与之前的版本相比,JDK 17 引入了一些重要的新特性、改进和优化,进一步提升了 Java 的性能、可维护性和功能性。以下是 JDK 17 的一些主要新特性和改进:

1. JEP 356:增强的伪随机生成器(Enhanced Pseudo-Random Number Generators)

  • 介绍:JDK 17 增强了伪随机数生成器(PRNGs)的功能。它引入了一个新的 RandomGenerator 接口和一组新的算法,支持包括跳跃式随机数生成器和流式随机数生成器等。
  • 改进
    • 增强了现有的随机数生成器,提供了更多种类的算法供开发者选择。
    • 改进了生成器的性能,并使其更符合现代计算需求。
import java.util.random.RandomGenerator;

RandomGenerator generator = RandomGenerator.of("L128X1024MixRandom");
int randomValue = generator.nextInt();

2. JEP 382:新的 macOS 渲染器(MacOS Rendering Pipeline)

  • 介绍:在 JDK 17 中,Java 重新设计了 macOS 上的图形渲染管道,移除了基于 OpenGL 的渲染管道,改为使用 Apple 的 Metal 渲染框架,这为 macOS 用户提供了更好的图形性能和兼容性。
  • 改进
    • 性能提升:通过使用 Metal,Java 在 macOS 上的图形渲染性能得到显著提升。
    • 兼容性:此改进使 Java 应用程序在 macOS 上运行时具有更好的兼容性,特别是在最新的 macOS 版本上。

3. JEP 389:外部内存访问 API(Foreign Function & Memory API)

  • 介绍:JEP 389 引入了 外部内存访问 API,这使得 Java 程序能够更安全、高效地访问非堆外的内存(例如,C 语言中的内存),而无需依赖本地代码(JNI)。
  • 改进
    • 提供了更高级的 API 来管理本地内存,从而避免了直接使用 Unsafe 类的潜在风险。
    • 提高了外部内存访问的性能和安全性,简化了开发过程。
try (var segment = MemorySegment.allocateNative(100)) {
    var buffer = segment.asByteBuffer();
    buffer.put(0, (byte) 42);
}

4. JEP 411:禁止 SecurityManager(Deprecate the SecurityManager for Future Removal)

  • 介绍:JDK 17 中,SecurityManager 被标记为 已弃用,并计划在未来的版本中移除。这个决定是因为 SecurityManager 在现代应用中的使用逐渐减少,而且其实现存在复杂性和性能瓶颈。
  • 影响:开发者应当开始寻找替代方案,特别是对有特殊安全需求的应用程序。

5. JEP 391:macOS/AArch64 Port

  • 介绍:JDK 17 为 macOS 上的 AArch64 架构(例如,Apple M1 芯片)提供了原生支持。
  • 改进
    • 提供了针对 Apple Silicon 设备(如 M1 芯片)的优化。
    • 开发者现在可以在 Apple M1 芯片上运行 Java 应用,并获得更好的性能。

6. JEP 409:简单的类文件格式(Sealed Classes)

  • 介绍:JEP 409 为 Java 引入了 密封类(Sealed Classes),这使得开发者能够限制哪些类可以继承或实现一个特定的类或接口。
  • 改进
    • 使用 sealed 关键字可以显式声明哪些类或接口可以继承或实现当前类,提供了一种更精确的控制继承结构的方式。
    • 这种机制通常用于领域模型、状态机等场景。
public sealed class Shape permits Circle, Square { }

public final class Circle extends Shape { }
public final class Square extends Shape { }

7. JEP 411:禁用或删除一些旧的、过时的 API

  • 介绍:JDK 17 继续去除一些历史遗留的、过时的 API 和工具。
  • 改进:这些 API 和工具长期没有得到维护,不再符合现代的 Java 开发需求。
    • 例如,去除了 SecurityManagerThread.stop() 等 API,进一步简化 Java 库。

8. JEP 382:增强的 Unicode 支持

  • 介绍:JDK 17 引入了对 Unicode 13.0 的全面支持,包括扩展符号、字形和脚本支持。
  • 改进:开发者现在可以更好地处理多语言和字符集,并获得最新的 Unicode 支持,提升了 Java 的全球化支持。

9. JEP 396:强制对 Java 编译器进行本地绑定

  • 介绍:JEP 396 强制要求 Java 编译器(javac)对本地平台进行编译,使得开发者能够确保 Java 应用程序在特定平台上的最佳表现。
  • 改进:这种绑定可以防止出现与平台相关的编译问题,减少了跨平台部署时的错误。

10. JEP 398:增强的 NullPointerException(NPE)消息

  • 介绍:JDK 17 对 NullPointerException(NPE)错误消息进行了增强,使得堆栈跟踪信息更加清晰和易于理解,尤其是在多个级别的嵌套调用中。
  • 改进
    • NPE 错误信息现在会提供更详细的上下文信息,帮助开发者更轻松地定位错误。
String str = null;
str.length(); // NullPointerException: Cannot invoke "String.length()" because "str" is null

11. 其他改进与修复

  • 性能提升:JDK 17 引入了多项性能优化,包括垃圾收集器的改进和新特性的支持。
  • G1 GC 优化:G1 垃圾收集器获得了一些性能改进,尤其是在内存占用和延迟控制方面。
  • 增强的 JFR(Java Flight Recorder)支持:改进了 JFR 的事件记录和分析功能,增强了对应用程序运行时的监控能力。

总结

JDK 17 作为一个长期支持版本,引入了很多重要的新特性和优化:

  • 密封类(Sealed Classes)提高了对继承的控制。
  • 增强的伪随机生成器(Enhanced Pseudo-Random Number Generators)提供了更灵活的随机数生成方式。
  • 新的 macOS 渲染管道(Metal)带来了更好的图形性能。
  • 外部内存访问 API(Foreign Function & Memory API)简化了本地内存的访问。
  • JEP 411JEP 396 强调了现代 Java 开发中的简化与性能。

作为 LTS 版本,JDK 17 对开发者而言是一个重要的版本,值得长期使用并充分利用其中的新特性。

如果你对某个特性有兴趣,或者需要更深入的示例,随时告诉我!