写点什么

JDK 23 和 JDK 24 最新动态

Michael Redlich

  • 2024-09-15
    北京
  • 本文字数:4838 字

    阅读完需:约 16 分钟

JDK 23 和 JDK 24 最新动态

JDK 23 是继 JDK 21 之后的第二个非长期支持(LTS)版本,正如甲骨文 Java 平台组首席架构师 Mark Reinhold 所 宣称 的那样,它已进入了第二个候选版本阶段。主线源代码库于 2024 年 6 月初(Rampdown 第一阶段)分支到 JDK 稳定代码库,并定义了 JDK 23 的特性集。严重缺陷,如回归或严重的功能问题,可能会得到修复,但必须通过修复请求(Fix-Request)流程获得批准。根据发布时间表,JDK 23 将于 2024 年 9 月 17 日正式发布。


最终将有 12 个新特性以 JEP 的形式发布,它们可被分为四 (4) 类:核心 Java 库Java 语言规范HotSpotJava 工具


这些新特性中,有六(6)个可归类为 核心 Java 库


JEP 466:类文件 API(Class-File API,第二次预览)


JEP 469:向量 API(Vector API,第八轮孵化)


JEP 471:弃用 sun.misc.Unsafe 中的内存访问方法以进行删除(Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal)


JEP 473:流收集器(Stream Gatherers,第二次预览)


JEP 480:结构化并发(Structured Concurrency ,第三次预览)


JEP 481:作用域值(Scoped Values,第三次预览)


这些新特性中,有四(4)个可归类为 Java 语言规范


JEP 455:模式、instanceof 和 switch 中的原始类型(Primitive Types in Patterns, instanceof, and switch,预览版)


JEP 476:模块导入声明(Module Import Declarations,预览版)


JEP 477:隐式声明的类和实例主方法(Implicitly Declared Classes and Instance Main Methods,第三次预览)


JEP 482:灵活的构造函数体(Flexible Constructor Bodies,第二次预览)


  • 这些新特性中,有一(1)个可归类为 HotSpot:


JEP 474:ZGC:默认采用分代模式(ZGC: Generational Mode by Default)


最后,这些新特性中,有一(1)个可归类为 Java 工具


JEP 467: Markdown 文档注释(Markdown Documentation Comments)


我们研究了其中的一些新特性以及支持它们的四个主要 Java 项目(Amber、Loom、Panama 和 Valhalla),这些项目旨在孵化一系列组件,然后通过精心策划的合并纳入到 JDK 中。

Amber 项目

JEP 482,灵活的构造函数体(Flexible Constructor Bodies,第二次预览),提议进行第二轮预览和名称更改,以获取上一轮预览的反馈,即 JEP 447,super(…) 前导语句(Statements before super(…),预览版),其在 JDK 22 中交付。该特性允许未引用正在创建的实例的语句出现在构造函数中的 this() 或 super() 调用之前;并为构造函数保留现有的安全和初始化保证。该 JEP 的更改包括:对局部类的处理;以及放宽了在显式构造函数调用之前不能访问字段的限制,将限制要求改为在显式构造函数调用之前不能读取字段。甲骨文技术人员顾问 Gavin Bierman 提供了该 JEP 的 初始规范,以供 Java 社区审查并提供反馈。


JEP 477,隐式声明的类和实例主方法(Implicitly Declared Classes and Instance Main Methods,第三次预览),以前称为未命名的类和实例主方法(Unnamed Classes and Instance Main Methods, 预览版)、灵活的主方法和匿名主类(Flexible Main Methods and Anonymous Main Classes,预览版)以及隐式类和增强的主方法(Implicit Classes and Enhanced Main Methods,预览版)。该 JEP 结合前两轮 预览 的反馈,加入了增强功能。前两次预览分别为:JEP 463,隐式类和实例主方法(Implicit Classes and Instance Main Methods,第二次预览),将在即将发布的 JDK 22 中交付;JEP 445,未命名的类和实例主方法(Unnamed Classes and Instance Main Methods ,预览版),在 JDK 21 中交付。该 JEP 提议“演进 Java 语言,以便学生无需理解为大型程序所设计的语言功能即可编写他们的首个程序。”该 JEP 推进了甲骨文 Java 语言架构师 Brian Goetz 于 2022 年 9 月发布的博客文章《铺路》(Paving the on-ramp)。甲骨文技术人员顾问 Gavin Bierman 编写的 最新规范 文档草案已开放给 Java 社区审查。有关 JEP 445 的更多详细信息,请参阅 InfoQ 的 这篇新闻报道。


JEP 476,模块导入声明(Module Import Declarations,预览版),提议增强 Java 编程语言,使其能够简洁地导入模块所暴露出来的所有包,其目的是简化模块库的重用,而无需导入模块本身的代码。


JEP 455,模式、instanceof 和 switch 中的原始类型(Primitive Types in Patterns, instanceof, and switch,预览版),提议通过允许在所有模式上下文中使用原始类型模式来增强模式匹配,并扩展 instanceofswitch 以允许其使用原始类型。甲骨文核心技术成员 Aggelos Biboudis 最近发布了该特性的 最新规范草案。

Loom 项目

JEP 481,作用域值(Scoped Values,第三次预览),以前称为范围局部变量(Extent-Local Variables , 孵化器),提供了第三次预览,该版本只包含一个更改,旨在从之前的一轮孵化和两次预览中获得额外的经验和反馈,即:JEP 464,作用域值(Scoped Values,第二次预览),在 JDK 22 中交付;JEP 446,作用域值(Scoped Values,预览版),在 JDK 21 中交付;以及 JEP 429,作用域值(Scoped Values ,孵化器),在 JDK 20 中交付。该特性允许在线程内和线程之间共享不可变数据。这比线程局部变量更可取,特别是在使用大量虚拟线程时。该特性的更改与在 ScopedValue 类中定义的 callWhere() 方法的操作参数有关,现在它是一个函数接口,允许 Java 编译器推断是否可能抛出已检查的异常。通过此更改,就不再需要 getWhere() 方法了,并且也已经将其删除了。


JEP 480,结构化并发(Structured Concurrency ,第三次预览),提供了第三次未做更改的预览,以便从之前两轮预览中获得更多的反馈,即:JEP 462,结构化并发(Structured Concurrency ,第二次预览),在 JDK 22 中交付;以及 JEP 453,结构化并发(Structured Concurrency,预览版),在 JDK 21 中交付。该特性通过引入结构化并发来简化并发编程,“将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和撤销,提高可靠性,并增强可观测性。”

Panama 项目

JEP 469,向量 API(Vector API,第八轮孵化),根据前七轮孵化的反馈进行了增强:JEP 460,向量 API(第七轮孵化),在 JDK 22 中交付;JEP 448,向量 API(Vector API ,第六轮孵化),在 JDK 21 中交付;JEP 438,向量 API(Vector API ,第五轮孵化),在 JDK 20 中交付;JEP 426,向量 API(Vector API ,第四轮孵化),在 JDK 19 中交付;JEP 417,向量 API(Vector API ,第三轮孵化),在 JDK 18 中交付;JEP 414,向量 API(Vector API,第二轮孵化),在 JDK 17 中交付;以及 JEP 338,向量 API(Vector API ,轮孵化器),在 JDK16 中作为 孵化器模块 提供。最初计划通过重复使用原始的 Incubator 状态进行重新孵化,但最终决定继续枚举。向量 API 将继续孵化,直到 Valhalla 项目的必要功能可作为预览功能提供时为止。届时,向量 API 团队将对向量 API 及其实现进行调整以便使用它们,并将向量 API 从 Incubator 状态提升到 Preview 状态。

字符串模板的更新

JEP 465,字符串模板(String Templates,第三次预览),经历了在 JDK 21 和 JDK 22 中的两个预览版本之后,由于一系列无法预见的问题而被关闭并撤回。该特性旨在通过字符串模板(包含嵌入式表达式的字符串文字)来增强 Java 编程语言,这些字符串模板在运行时对嵌入式表达式进行评估和验证。有关撤回该 JEP 的原因的更多详细信息,请参阅甲骨文 Java 开发倡导者 Nicolai Parlog 的这篇博客文章以及甲骨文 Java 语言架构师 Brian Goetz 的这封电子邮件。

JDK 24

计划于 2025 年 3 月发布 GA 版本,目前只有一个针对 JDK 24 的 JEP。然而,根据一些 JEP 候选和草案,特别是那些已经提交的,我们可以推测出哪些额外的 JEP 有可能被包含在 JDK 24 中。


JEP 472,准备限制对 JNI 的使用(Prepare to Restrict the Use of JNI),已经被定为 JDK 24 的目标。该 JEP 提议限制与 JDK 22 中所提供的外部函数和内存(Foreign Function & Memory,FFM)API 中的受限方法一起使用的本质上不安全的 Java 本机接口(Java Native Interface,JNI)。从即将发布的 JDK 23 开始,如果 FFM 用户未在命令行上启用不安全的本机访问,对齐策略将使 Java 运行时显示有关使用 JNI 的警告。预计在 JDK 23 之后的版本中,使用 JNI 将抛出异常而不是警告。更多详细信息可参阅 InfoQ 的这篇新闻报道。


JEP 404,分代 Shenandoah( Generational Shenandoah,实验性),尽管目前还处于 Candidate 状态,但最近已更新并被包含在了 JDK 24 中。我们预计该 JEP 将很快被提升为 Proposed to Target 状态。JEP 404 最初的目标是 JDK 21,但由于“在审查过程中发现了风险并且缺乏足够的时间来对如此大量的代码贡献进行执行彻底的审查”,JEP 404 被正式从最终功能集中 移除。Shenandoah 团队决定“尽其所能创造出最好的分代 Shenandoah”,并将目标锁定在未来版本中。


JEP 401,值类和对象(Value Classes and Objects,预览版),以前称为空限制值对象存储(Null-Restricted Value Object Storage,预览版)


和基元类(Primitive Classes,预览版),在 Valhalla 项目的赞助下,引入了开发人员声明的基元类——由 Value Objects API 定义的特殊类型的值类,用于定义新的基元类型。


JEP 草案 8334712,类文件 API(Class-File API),提议在经过两轮预览后,在 JDK 24 中完成该特性:JEP 466,类文件 API(Class-File API,第二次预览),将在即将发布的 JDK 23 中交付;以及 JEP 457,类文件 API(Class-File API,预览版),在 JDK 22 中交付。该特性提供了一个用于解析、生成和转换 Java 类文件的 API。它最初将作为 JDK 中 ASM(Java 字节码操作和分析框架)的内部替代品,并计划将其作为公共 API 开放。Goetz 将 ASM 描述为“一个带有大量遗留包袱的旧代码库”,并提供了有关该特性将如何发展并最终取代 ASM 的背景信息。


JEP 草案 8326035,CDS 对象流(CDS Object Streaming),提议在 Z 垃圾收集器(ZGC)中添加一个用于类数据共享(CDS)的对象归档机制,该机制具有统一的 CDS 对象归档格式和加载器。该特性将使 GC 实现细节和策略与 CDS 存档对象流机制分开。


JEP 草案 8300911,PEM API(预览版),引入了一种简单直观的 API,用于对隐私增强邮件(Privacy-Enhanced Mail,PEM)格式进行编码和解码,以描述最多只能更改一次的值持有者。该 PEM 格式将用于存储和发送加密密钥和证书。


JEP 草案 8291976,在 HttpClient 中支持 HTTP/3,提议更新 JDK 11 中交付的 JEP 321,HTTP 客户端(HTTP Client),以支持 HTTP/3 协议。这将允许应用程序和库与 HTTP/3 服务器交互,并以最小的代码更改代价获得 HTTP/3 的好处。


JEP 草案 8312611,稳定值(Stable Values,预览版),以前称为计算常数(Computed Constants,预览版),引入了计算常数的概念,定义为最多初始化一次的不可变值持有者。这提供了 final 字段的性能和安全优势,同时在初始化时间方面提供了更大的灵活性。


我们预计 Oracle 将很快开始针对 JDK 24 提供更多的额外 JEP。

作者介绍

Michael Redlich 在过去的 25 年里一直是 Java 社区的活跃成员。他于 2001 年创立了 Garden State Java 用户组(其前身为 ACGNJ Java 用户组),该组目前仍在持续运营。自 2016 年以来,Mike 一直担任 InfoQ 的 Java 社区新闻编辑,他的贡献包括每月新闻报道、技术写作和技术评论。他曾在 Oracle Code One、企业新兴技术、特伦顿计算机节(TCF)、TCF IT 专业会议和众多 Java 用户组等场合发表演讲。Mike 是 Jakarta NoSQL 和 Jakarta Data 规范的提交者,并参加了 Jakarta EE 大使的领导委员会。他于 2023 年 4 月被任命为 Java 冠军。凭借 33 年半的服务经验,Mike 最近从新泽西州克林顿的埃克森美孚技术与工程公司退休,并且他拥有开发定制科学实验室和网络应用程序的经验。他还曾在 Ai-Logix, Inc.(现为 AudioCodes)担任技术支持工程师,为客户提供技术支持并开发电话应用程序。

2024-09-15 10:001

评论

发布
暂无评论

期末大作业一

心在那片海

期末大作业二

心在那片海

简金秋:区块链技术构建服装行业全新商业模式

CECBC

区块链 服装行业

话题讨论:公司已经发不出工资了,你会选择坚持还是放弃?

石云升

话题讨论 2月春节不断更

张弛之间,皆是生活

boshi

随笔 七日更

从崩溃的选课系统,论为什么更安全的 HTTPS 协议没有被全面采用

飞天小牛肉

Java 程序员 面试 计算机网络 2月春节不断更

week-13-作业一

未来已来

“五年饮冰,难凉热血”,一名专科生的求学历程

不脱发的程序猿

程序人生 心路历程 2月春节不断更 大学总结 2020年度总结

复盘银行的区块链实践:从分布式账本,到产业数字化

CECBC

大数据 银行

基于Docker的大数据开发环境 - HDP Sandbox

大数志

大数据 hadoop spark

week12-作业一

未来已来

AI窥人(一):为什么人类热衷“过度投射”?

脑极体

阿里架构师经验分享!写给互联网大厂员工的真心话,最全的BAT大厂面试题整理

欢喜学安卓

android 程序员 面试 移动开发

使用 Tye 辅助开发 k8s 应用竟如此简单(二)

newbe36524

微服务 k8s dotnet 服务发现

热乎的阿里、百度、平安等大厂面试真题 你要不要?

比伯

Java 编程 架构 面试 计算机

大作业1-同城快递业务系统设计

arcyao

让人“眼前一亮、不明觉厉”的互联网技术PPT

不脱发的程序猿

程序人生 PPT 2月春节不断更 互联网技术PPT 互联网工具

话题讨论 | 云原生应用应该是什么样子?面临的技术挑战有哪些?

xcbeyond

微服务 云原生 Service Mesh 话题讨论

Java线上故障解决方案

Java 架构

从零开始学Android!15个经典面试问题及回答思路,这原因我服了

欢喜学安卓

android 程序员 面试 移动开发

week12-根据当周学习情况,完成一篇学习总结

未来已来

week13-作业二-根据当周学习情况,完成一篇学习总结

未来已来

《王阳明一切心法》读书随笔

BigYoung

读书笔记 28天写作 2月春节不断更 王阳明

探寻内部类的奥秘(下)

后台技术汇

2月春节不断更

如何制作和使用自签名证书

soulteary

Docker SSL证书

全球区块链与数字经济领军课程

CECBC

数字经济 科技

1. 这才是 Python 学习的正确起手姿势,滚雪球学 Python

梦想橡皮擦

Python python 爬虫 2月春节不断更 python入门 python学习

用python提前预测jvm cpu100%自动dump thread

程序员石磊

JVM Thread cpu 100%

反常识的学习思维

小匚

自我思考 成长笔记

架构师训练营大作业

菜青虫

Springboot+Netty+Websocket实现消息推送实例

Java架构师迁哥

JDK 23 和 JDK 24 最新动态_编程语言_InfoQ精选文章