Java 23发布,提供了Markdown文档、ZGC分代模式并废弃sun.misc.Unsafe

图片

作者 | Michael Redlich
译者 | 张卫滨
策划 | 丁晓昀

甲骨文 发布了Java 编程语言和虚拟机的 23 版本。作为 JDK 21 之后的第一个非 LTS 版本,最终的 12 个 JEP 特性包括:

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

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

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

  • JEP 469:Vector API(第八轮孵化)

  • JEP 471:废弃 sun.misc.Unsafe 中的内存访问方法以便于将其移除(Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal)

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

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

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

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

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

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

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

其中的三项特性(Markdown 文档注释ZGC:默认的分代模式以及废弃sun.misc.Unsafe中的内存访问方法以便于将其移除)是非经预览流程的最终特性。

如下图所示,正如该博客文章所述,从交付的特性数量上来看,JDK 23 与四年前 JDK 14 之后的其他版本差不多,只不过 JDK 18、JDK 19 和 JDK 20 与这些版本有一定的差异。

图片

在本文中,我们将会详细介绍其中的一些 JEP,讨论 JDK 23 的发布会,并更新对 JDK 24 可能会包含的特性的预测。

Markdown 文档注释

JEP 467,Markdown 文档注释,建议使用 Markdown(一种流行的标记语言,常见于开源项目中)编写 JavaDoc 文档注释,取代 HTML 和 JavaDoc @标记的混合体。它的目的是提供更易于阅读和编写的改进文档。

ZGC:默认的分代模式

JEP 474,ZGC:默认的分代模式,建议将 Z 垃圾收集器(ZGC)从默认使用非分代模式切换为分代模式。非分代模式将会废弃,并在未来的 JDK 版本中移除。这最终会降低维护这两种模式的成本,未来的开发工作主要集中在 JEP 439,分代式 ZGC 上。关于这方面的详细信息,请参阅 InfoQ 的 新闻。

废弃 sun.misc.Unsafe 中的内存访问方法以便于将其移除

JEP 471,废弃 sun.misc.Unsafe 中的内存访问方法以便于将其移除,建议废弃Unsafe中的内存访问方法,以便在未来的 JDK 版本中将其移除。这些方法已经被其他的 JDK 特性所取代,比如 JDK 9 交付的 JEP 193,变量句柄(Variable Handles) 以及 JDK 22 所交付的 JEP 454,外部函数与内存 API(Foreign Function & Memory API)。

流收集器(第二轮预览)

JEP 473,流收集器(第二轮预览),建议在上一轮(即 JDK 22 交付的 JEP 461, 流收集器(预览))的基础上进行第二次预览。与 JEP 461 相比,它没有面向用户的改动,这会有更多的时间获取关于该特性的反馈和用户使用体验。该特性的目的是增强 Stream API,以支持自定义的中间操作,从而“允许流管道以现有内置中间操作难以实现的方式转换数据”。关于该 JEP 的更多详情,请参阅原始设计文档和 InfoQ 的新闻报道。

类文件 API(第二轮预览)

JEP 466,类文件 API(第二轮预览),建议进行第二轮预览,以获取上一轮预览的反馈,即 JDK 22 交付的 JEP 457,类文件 API(预览)。该特性提供了用于解析和生成 Java 类文件的 API,以改进转换过程。它最初的目的是作为 JDK 中 ASM(Java 字节码操作和分析框架)的内部替代方案,并计划将其作为公开 API 对外发布。甲骨文公司的 Java 语言架构师 Brian Goetz 认为 ASM 是“带有大量遗留问题的旧代码库”,并提供了该草案如何发展并最终取代 ASM 的背景信息。

JDK 23 发布会

JDK 23 发布会在 2024 年 9 月 17 日的 13:00 至 16:30 UTC 进行了直播,发布会由甲骨文的 Java 开发人员倡导者 Ana-Maria Mihalceanu、Billy Korando 和 Nicolai Parlog 主持,主要讨论的话题包括 Java 23 新特性的深入介绍、Java 在 2024 年的外联活动以及 Java 的预览特性和未来工作。发布会的特邀嘉宾包括:

  • 甲骨文的技术顾问 Gavin Bierman 讨论了 Amber 项目 和 JDK 23 中的四个 JEP,即灵活的构造函数体(第二轮预览)隐式声明的类和实例主方法(第三轮预览)模块导入声明(预览)以及模式、instanceof 和 switch 中的原始类型(预览)他还说明了至少目前取消 字符串模板(String Templates)API 的原因,该 API 原计划在 JDK 24 发布时完成。

  • 甲骨文公司 Loom 项目的架构师兼技术负责人 Ron Pressler 介绍了 JEP Draft 8305968默认完整性(Integrity by Default),这是一项新特性,建议“限制 Java 平台中的不安全 API,以便在默认情况下库、框架和工具无法使用它们。应用程序作者将能够覆盖这一默认值”。

  • 甲骨文的软件工程师 Maurizio Cimadamore 讨论了外部函数与内存(FFM)API 的改进,该功能已在 JDK 22 中确定。这些改进包括,在 FFM 中使用 ByteBuffer类的限制、MemorySegment接口以及 JStruct(一个简单的jextract插件,可生成给定头文件中的所有结构布局)。

  • 甲骨文的首席技术成员 Jonathan Gibbons 讨论了新的Markdown 文档注释API 背后的动机、使用方法以及开发人员未来可期待的功能。

  • 甲骨文的高级经理 Stefan Karlson 讨论了ZGC:默认的分代模式API 中的新特性,以及为什么开发人员应该迁移到该特性而不是只有一个代的垃圾收集器。

  • 甲骨文的首席软件开发工程师 Denys Makogon 介绍了 Java Playground 的更新情况,这是一个基于 JShell 工具的图形用户界面,用于编写和执行 Java 代码。

  • 甲骨文的高级总监兼 Java 教育负责人 Heather Stephens 讨论了 2020 年 6 月启动的 Java 教育(Java in Education) 计划的重要性,该计划旨在为教育机构提供更好的资源,使其能够不再局限于 JDK 8 的教学。关于该计划的更多详情,请参阅本篇 InfoQ 新闻报道

  • 甲骨文的产品管理与开发人员参与的高级总监 Sharat Chander 和甲骨文的软件项目管理 Jim Grisanzio 提供了 Java 社的区报告,内容包括 Java 用户组的认可、热门会议以及 Sip of JavaJEP CafeInside Java Newscast 系列的概述。Chander 还提醒与会者,JavaOne 将于 2025 年再次 举办,以庆祝 Java 的 30 岁生日。议题征集截止 2024 年 10 月 10 日 17:00 PDT。

  • 甲骨文实验室的首席开发人员倡导者 Alina Yurenko 和甲骨文实验室 GraalVM 团队研究经理 Fabio Niephaus 简要介绍了与 JDK 23 同时发布的 GraalVM for JDK 23除了新功能外,GraalVM 还宣布 GraalPy 不再是实验性的。Niephaus 演示了使用 GraalPy 和 GraalWasm 的应用程序。

  • Brian Goetz 讨论了类文件API,以及甲骨文为什么要提供用于处理 Java 类文件的 API。根据用户的反馈意见,甲骨文对该 API 进行了修改,Goetz 希望该功能能在 JDK 24 中最终完成。有关类文件 API 的更多详情,请参阅 YouTube 视频

  • 甲骨文的 JVM 架构师 John Rose 提供了 Leyden 项目 的最新信息,该项目旨在改进“Java 程序的启动时间、峰值时间性能和占用空间”。

JDK 23 现在可以从甲骨文的网站下载,其他供应商的二进制文件预计将在未来几天内推出。

JDK 24

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

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 484,类文件 API,目前处于候选状态,建议经过两轮预览(即 JDK 23 交付的 JEP 466, 类文件 API(第二轮预览) 和 JDK 22 交付的 JEP 457, 类文件 API(预览))后在 JDK 24 中最终确定该特性。第二次预览版之后的 变更 包括:AnnotationValue.OfConstant接口中定义了一个新方法resolvedValue(),以及一些方法的重命名、从某个接口转移至另一个接口或移除。

JEP Draft 8338456,作用域值(第四次预览),建议进行第四次预览,并做了一处修改,以便从之前的一轮孵化和三轮预览中获得更多经验和反馈,即 JDK 23 交付的 JEP 481, 作用域值(第三次预览)、JDK 22 交付的 JEP 464, 作用域值(第二次预览)、JDK 21 交付的 JEP 446, 作用域值(第二次预览) 和 JDK 20 交付的 JEP 429, 作用域值(孵化)。该特性以前称为“扩展局部变量(孵化)”,可在线程内和线程间共享不可变数据。与线程局部变量相比,该功能更值得推荐使用,尤其是在使用大量虚拟线程的时候。

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

JEP Draft 8291976, 在 HttpClient 中支持 HTTP/3, 建议更新 JDK 11 中的 JEP 321,HTTP Client,以支持 HTTP/3 协议。这将允许应用程序和库能够与 HTTP/3 服务器进行交互,并以最小的代码改动获得 HTTP/3 的收益。

JDK 24 的正式发布日期预计为 2025 年 3 月,甲骨文公司 Java Platform Group 首席架构师 Mark Reinhold 不久将会发布这一提议。预计特性将于 2024 年 12 月初冻结。有关其他 JEP 草案和候选版本的更多详细信息,请参阅 InfoQ 的 新闻报道。

查看英文原文:

声明:本文由 InfoQ 翻译,未经许可禁止转载。