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
类的潜在风险。 - 提高了外部内存访问的性能和安全性,简化了开发过程。
- 提供了更高级的 API 来管理本地内存,从而避免了直接使用
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 开发需求。
- 例如,去除了
SecurityManager
和Thread.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 411 和 JEP 396 强调了现代 Java 开发中的简化与性能。
作为 LTS 版本,JDK 17 对开发者而言是一个重要的版本,值得长期使用并充分利用其中的新特性。
如果你对某个特性有兴趣,或者需要更深入的示例,随时告诉我!
发表回复