jdk21新特新
JDK 21 - 2023-09-19 现已推出!
甲骨文现在提供JDK 21面向开发人员、用户和企业。
Oracle将为Java 21提供至少八年的长期支持。这一延长的支持期使组织能够灵活地将应用程序投入生产更长时间,只需最少的维护,并最终按照自己的方式进行迁移。根据客户的反馈和在Java生态系统中的使用情况,Oracle还宣布对Java 11的长期支持至少延长到2032年1月,Oracle将提供至少八年的支持和更新。
Java 21中的新特性
除了数以千计的性能、稳定性和安全性更新之外,Java 21还提供了许多新特性和增强功能,15项重要到足以证明他们自己jdk改进提案,涵盖了六个预览功能和一个孵化器功能。
Java 21提供的15个jep分为六个类别,分别对应于关键的长期Java技术项目和硬件支持。
JEP 430:字符串模板(预览)
- JEP目标:
- 通过简化包含运行时计算值的字符串的表达,简化了Java程序的编写。
- 增强混合文本和表达式的表达式的可读性,无论文本是适合单个源代码行(如字符串文字)还是跨越多个源代码行(如文本块)。
- 通过支持模板及其嵌入表达式的值的验证和转换,提高了Java程序的安全性,这些程序根据用户提供的值组成字符串,并将它们传递给其他系统(例如,为数据库构建查询)。
- 通过允许Java库定义字符串模板中使用的格式语法,保持了灵活性。
- 简化接受非Java语言(例如SQL、XML和JSON)编写的字符串的API的使用。
- 允许创建从文本和嵌入表达式计算的非字符串值,而不必通过中间字符串表示形式进行转换。
- 价值:
- 遵循Amber项目的目标,String Templates旨在使Java编程语言更具可读性、可写性和可维护性。
JEP 440:记录模式
- JEP目标:
- 通过将模式匹配扩展到记录类的非结构化实例,增强了Java编程语言,支持更复杂的数据查询。
- 添加嵌套模式,支持更多可组合的数据查询。
- 与以下内容相关:
- [JDK 19] JEP 405:记录模式(预览)
- [JDK 20] JEP 432:记录模式(预览)
- 价值:
- 通过扩展模式匹配来表达更复杂、可组合的数据查询,使Java编程语言更有效率。
JEP 441:开关的模式匹配
- JEP目标:
- 通过允许模式出现在case标签中,扩展了switch表达式和语句的表达能力和适用性。
- 允许在需要时放松开关的历史零敌意。
- 通过要求模式切换语句覆盖所有可能的输入值,提高了切换语句的安全性。
- 确保所有现有的开关表达式和语句继续编译而不做任何更改,并以相同的语义执行。
- 与以下内容相关:
- 【JDK 17】JEP 406:模式匹配换开关(预告)
- [JDK 18] JEP 420:开关的模式匹配(预览)
- [JDK 19] JEP 427:开关的模式匹配(预览)
- [JDK 20] JEP 433:开关的模式匹配(预览)
- 价值:
- 通过使Java编程语言更具语义性来提高Java编程语言的生产率,以便能够简洁而安全地表达复杂的面向数据的查询。
JEP 443:未命名的模式和变量(预览)
- JEP目标:
- 用未命名的模式和未命名的变量增强Java语言,未命名的模式匹配记录组件而不声明组件的名称或类型,未命名的变量可以初始化但不能使用。两者都用下划线字符\表示。
- 价值:
- 通过省略不必要的嵌套模式来提高记录模式的可读性。
- 通过标识必须声明(例如,在catch子句中)但不会使用的变量,提高了所有代码的可维护性。
JEP 445:未命名的类和实例主方法(预览)
- JEP目标:
- 为Java提供了一个平滑的入口,以便教育工作者能够以渐进的方式引入编程概念。
- 帮助学生以简洁的方式编写basic程序,并随着他们技能的提高而优雅地发展他们的代码。
- 减少编写脚本和命令行实用程序等简单程序的仪式。
- 不介绍单独的Java初学者方言。
- 没有引入单独的初学者工具链;学生程序应该用编译和运行任何Java程序的相同工具来编译和运行。
- 价值:
- 通过减少样板文件和仪式来发展Java语言,以便学生可以编写他们的第一个程序,而不需要理解为大型程序设计的语言特性。
JEP 444:虚拟线程
- JEP目标:
- 使以简单的每请求线程方式编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展。
- 使使用java.lang.Thread API的现有代码能够采用虚拟线程,而只需做最小的更改。
- 使用现有的JDK工具可以轻松地对虚拟线程进行故障排除、调试和分析。
- 涉及:
- [JDK 20] JEP 436:虚拟线程(预览)
- [JDK 19] JEP 425:虚拟线程(预览)
- 价值:
- 通过引入虚拟线程来提高应用程序开发效率,例如针对云环境的应用程序,虚拟线程是一种轻量级线程,可以大大减少编写、维护和观察高吞吐量并发应用程序的工作量。
JEP 446:作用域值(预览)
- JEP目标:
- 支持在线程内和线程间共享不可变数据。
- 与以下内容相关:
- [JDK 20] JEP 429:范围价值(孵化器)
- 价值:
- 易用性—提供了一个编程模型来共享线程内和子线程间的数据,从而简化了关于数据流的推理。
- 可理解性—使共享数据的生命周期从代码的语法结构中可见。
- 健壮性——确保只有合法的被调用者才能检索调用者共享的数据。
- 性能—将共享数据视为不可变的,以便允许大量线程共享,并实现运行时优化。
JEP 453:结构化并发(预览版)
- JEP目标:
- 通过引入用于结构化并发的API来简化并发编程。
- 提倡一种并发编程风格,这种风格可以消除由取消和关闭引起的常见风险,例如线程泄漏和取消延迟。
- 提高并发代码的可观察性。
- 与以下内容相关:
- [JDK 19] JEP 428:结构化并发(孵化器)
- [JDK 20] JEP 437:结构化并发(孵化器)
- 价值:
- 通过引入用于结构化并发的API来简化并发编程。这简化了错误处理和消除,提高了可靠性并增强了可观察性。
- JEP 442:外部函数和内存API JEP目标:
- 引入了一个API,Java程序可以通过它与Java运行时之外的代码和数据进行互操作。通过有效地调用外来函数(即JVM外的代码),并通过安全地访问外来存储器(即不由JVM管理的存储器),API使得Java程序能够调用本地库并处理本地数据,而没有JNI的脆弱性和危险。这是一个预览API。
- 与以下内容相关:
- [JDK 19] JEP 424:外部函数和内存API(预览版)
- [JDK 20] JEP 434:外来函数和内存API (预览)
- 价值:
- 易用性——用优秀的纯Java开发模型取代了Java本机接口(JNI)。
- 性能—提供与现有API(如JNI和sun.misc.Unsafe)不相上下的性能
- 通用性—提供在不同种类的外来存储器(例如,本机存储器、永久存储器和托管堆存储器)上操作的方式,并且随着时间的推移,适应其他平台(例如,32位x86)和用除C之外的语言(例如,C++、Fortran)编写的外来函数。
- 安全—允许程序在外部内存上执行不安全的操作,但默认情况下会警告用户此类操作。
JEP 448:矢量API(也可以理解为向量)
- JEP目标:
- 引入了一个API来表达矢量计算,该计算在运行时可靠地编译为支持的CPU架构上的最佳矢量指令,从而实现优于等效标量计算的性能。
- 其中包括以下显著变化:
- 将异或(xor)运算添加到矢量掩码。
- 提高向量随机播放的性能,尤其是在用于重新排列向量元素和在向量之间转换时。
- 与以下内容相关:
- [JDK 16] JEP 338:载体API(孵化器)
- [JDK 17] JEP 414:矢量API (孵化器)
- [JDK 18] JEP 417:矢量API (孵化器)
- [JDK 19] JEP 426:矢量API (孵化器)
- [JDK 20] JEP 438:矢量API (孵化器)
- 价值:
- 提供了一个清晰简洁的API,能够清晰简洁地表达大范围的矢量计算,包括循环内的矢量运算序列,可能还有控制流
- API应该是CPU架构不可知的,能够在支持向量指令的多种架构上实现。
- 在x64和AArch64架构上提供可靠的运行时编译和性能
核心库
JEP 431:序列集合
- JEP目标:
- 引入新的接口来表示具有定义的相遇顺序的集合。每个这样的集合都有定义明确的第一个元素、第二个元素等等,直到最后一个元素。
- 提供统一的API来访问它的第一个和最后一个元素,并以相反的顺序处理它的元素。
- 价值:
- 通过提供跨集合类型应用的统一操作集来提高开发人员的工作效率,该集合类型表示具有定义的相遇顺序的元素序列。
性能更新
JEP 439:世代ZGC
- JEP目标:
- 价值:
- 使用分代ZGC运行的应用应该享有:
- 降低分配停滞的风险。
- 降低所需的堆内存开销。
- 降低垃圾收集CPU开销。
- 与非新一代ZGC相比,这些优势应该不会显著降低吞吐量。非世代ZGC的基本特性应该保留:
- 暂停时间不应超过1毫秒。
- 应该支持从几百兆字节到几兆兆字节的堆大小。
- 应该需要最少的手动配置。
- 使用分代ZGC运行的应用应该享有:
JEP 452:密钥封装机制API
- JEP目标:
- 介绍一种用于密钥封装机制(KEMs)的API,KEMs是一种使用公钥加密来保护对称密钥的加密技术。
- 价值:
- 支持应用程序使用KEM算法,如RSA密钥封装机制(RSA-KEM)、椭圆曲线集成加密方案(ECIES)以及美国国家标准与技术研究院(NIST)后量子密码标准化流程的候选KEM算法。
- 允许在诸如传输层安全性(TLS)之类的高级协议中以及在诸如混合公钥加密(HPKE).
- 允许安全提供者用Java代码或本机代码实现KEM算法。
维护和折旧
JEP 449:不赞成删除Windows 32位x86端口
- JEP目标:
- 弃用Windows 32位x86端口,并打算在未来的版本中将其删除。
- 价值:
- 更新生成系统,以便在尝试为Windows 32位x86 (x86-32)配置生成时发出错误信息。通过新的配置选项可以抑制错误消息。
- 在相关文档中将端口和相关的端口特定功能标记为不推荐删除。
JEP 451:准备禁止代理的动态加载
- JEP目标:
- 当代理被动态加载到正在运行的JVM中时发出警告。这些警告旨在让用户为将来的版本做好准备,该版本默认情况下不允许动态加载代理,以便默认情况下提高完整性。在启动时加载代理的可维护性工具不会导致在任何版本中发出警告。
- 价值:
- 为JDK的未来版本做准备,默认情况下,该版本不允许将代理加载到正在运行的JVM中。
- 重新评估可服务性和完整性之间的平衡,可服务性包括对正在运行的代码进行特别的更改,完整性假设正在运行的代码不会被任意更改。
- 确保大多数不需要动态加载代理的工具不受影响。
https://openjdk.org/jeps/430