JDK 10 新特性 - JEP 286:局部变量类型推断
增强 Java 语言,将类型推断扩展到带有初始化器的局部变量声明。
增强 Java 语言,将类型推断扩展到带有初始化器的局部变量声明。
将 JDK 系列的众多代码库合并为一个单一的代码库,以简化和优化开发流程。
通过引入一个简洁的垃圾回收器(GC)接口,改善不同垃圾回收器的源代码隔离性。
通过使 full GC 并行来改善 G1 的最坏情况延迟。
为了改进启动和占用空间,扩展现有的类数据共享(“CDS”)功能,以允许将应用类放入共享存档中。
介绍一种在不执行全局 VM 安全点的情况下在线程上执行回调的方法。使得停止单个线程变得既可行又低成本,而不仅仅是停止所有线程或一个都不停。
增强 `java.util.Locale` 和相关 API,以实现 BCP 47 语言标签的更多 Unicode 扩展。
启用 HotSpot 虚拟机在用户指定的替代内存设备(例如 NV-DIMM)上分配 Java 对象堆。
启用基于 Java 的即时编译器 Graal,作为 Linux/x64 平台上实验性的即时编译器使用。
修订 Java SE 平台和 JDK 的版本字符串方案以及相关版本信息,以适应当前和未来的基于时间的发布模型。
在 JDK 中提供一组默认的根证书颁发机构 (CA) 证书。
JEP 286: Local-Variable Type Inference
引入 nests,这是一种访问控制上下文,与 Java 编程语言中现有的嵌套类型概念相一致。Nests 允许在逻辑上属于同一代码实体的类(但编译为不同的类文件)互相访问对方的私有成员,而无需编译器插入扩大访问范围的桥接方法。
扩展 Java 类文件格式以支持一种新的常量池形式,`CONSTANT_Dynamic`。加载 `CONSTANT_Dynamic` 时会将其创建委托给一个引导方法(bootstrap method),就像链接 `invokedynamic` 调用点时将链接操作委托给引导方法一样。
改进现有的字符串和数组内在函数,并在 AArch64 处理器上为 `java.lang.Math` 的 sin、cos 和 log 函数实现新的内在函数。
从 Java SE 平台和 JDK 中移除 Java EE 和 CORBA 模块。这些模块在 Java SE 9 中已被弃用,并声明将在未来的版本中移除。
通过 JEP 110 标准化在 JDK 9 中引入并在 JDK 10 中更新的孵化版 HTTP Client API。
允许在声明隐式类型的 lambda 表达式的形参时使用 `var`。
按照 RFC 7748 中的描述,使用 Curve25519 和 Curve448 实现密钥协商。
升级现有平台 API,以支持 Unicode 标准的 10.0 版本。
提供一个用于排查 Java 应用程序和 HotSpot JVM 的低开销数据收集框架。
根据 RFC 7539 实现 ChaCha20 和 ChaCha20-Poly1305 加密算法。ChaCha20 是一种相对较新的流加密算法,可以替代较旧且不安全的 RC4 流加密算法。
增强 Java 启动器,以运行作为单个 Java 源代码文件提供的程序,包括通过“shebang”文件及相关技术在脚本内部使用。
提供一种通过 JVMTI 访问的低开销 Java 堆分配采样方法。
实现传输层安全(TLS)协议 RFC 8446 的版本 1.3。
Z 垃圾收集器,也被称为 ZGC,是一个可扩展的低延迟垃圾收集器。
弃用 Nashorn JavaScript 脚本引擎和 API,以及 jjs 工具,并打算在未来的版本中删除它们。
弃用 pack200 和 unpack200 工具,以及 java.util.jar 中的 Pack200 API。
JEP 181: Nest-Based Access Control
新增一个名为 **Shenandoah** 的垃圾回收 (GC) 算法,该算法通过与正在运行的 Java 线程同时进行疏散工作来减少 GC 暂停时间。使用 Shenandoah 时,暂停时间与堆大小无关,这意味着无论您的堆是 200 MB 还是 200 GB,暂停时间都将保持一致。
在 JDK 源代码中添加一套基本的微基准测试,并让开发者能够轻松运行现有的微基准测试并创建新的测试。
扩展 `switch` 语句,使其既可以用作语句,也可以用作表达式,并且两种形式都可以使用“传统”或“简化”的作用域和控制流行为。这些更改将简化日常编码,同时也为在 `switch` 中使用模式匹配(JEP 305)铺平了道路。这是 JDK 12 中的预览语言功能。
引入一个 API,用于对关键类文件和运行时工件的名义描述进行建模,特别是可以从常量池加载的常量。
移除所有与 arm64 移植相关的源代码,同时保留 32 位 ARM 移植和 64 位 aarch64 移植。
增强 JDK 构建过程,以便在 64 位平台上使用默认类列表生成类数据共享 (CDS) 存档。
如果 G1 混合回收可能会超出暂停目标,则使其可中止。
增强 G1 垃圾收集器,以便在空闲时自动将 Java 堆内存返还给操作系统。
JEP 189 A Low-Pause-Time Garbage Collector (Experimental)
扩展应用类数据共享,以允许在 Java 应用程序执行结束时对类进行动态归档。归档的类将包括所有已加载的应用程序类和库类,这些类不在默认的基础层 CDS 归档中。
增强 ZGC 以将未使用的堆内存返回给操作系统。
用更简单、更现代的实现替换 `java.net.Socket` 和 `java.net.ServerSocket` API 的底层实现,这种新实现将易于维护和调试。新的实现将很容易适配用于与用户模式线程(也称为 fibers,目前在 Project Loom 中正在探索)一起工作。
扩展 `switch`,使其既可以用作语句,也可以用作表达式,并且两种形式都可以使用传统的 `case ... :` 标签(带贯穿)或新的 `case ... ->` 标签(不带贯穿),同时引入一个新的语句用于从 `switch` 表达式中生成值。这些更改将简化日常编码,并为在 `switch` 中使用模式匹配(JEP 305)铺平道路。这是 JDK 13 中的预览语言功能。
向 Java 语言中添加文本块。文本块是一种多行字符串字面量,它避免了大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时给予开发者对格式的控制权。这是 JDK 13 中的一个预览语言功能。
JEP 350: Dynamic CDS Archives
通过为 instanceof 操作符添加模式匹配来增强 Java 编程语言。模式匹配允许程序中的常见逻辑,即从对象中条件性地提取组件,能够以更简洁、更安全的方式表达。这是 JDK 14 中的预览语言功能。
创建一个用于打包自包含 Java 应用程序的工具。
通过实现 NUMA 感知的内存分配来提升大型机器上的 G1 性能。
公开 JDK Flight Recorder 数据以进行持续监控。
新增 JDK 特定的文件映射模式,以便 FileChannel API 可用于创建引用非易失性内存的 MappedByteBuffer 实例。
通过准确描述哪个变量为 null,来提高 JVM 生成的 NullPointerException 的可用性。
通过记录(records)增强 Java 编程语言。记录提供了一种紧凑的语法,用于声明透明持有浅层不可变数据的类。这是 JDK 14 中的预览语言功能。
扩展 `switch`,使其既可以用作语句,也可以用作表达式,并且两种形式都可以使用传统的 `case ... :` 标签(带贯穿)或新的 `case ... ->` 标签(不带贯穿),同时引入一个新的语句用于从 `switch` 表达式中生成值。这些更改将简化日常编码,并为在 `switch` 中使用模式匹配铺平道路。这是 JDK 12 和 JDK 13 中的预览语言功能。
移除并发标记清除(CMS)垃圾收集器。
将 ZGC 垃圾收集器移植到 macOS。
将 ZGC 垃圾收集器移植到 Windows。
移除 `pack200` 和 `unpack200` 工具,以及 `java.util.jar` 包中的 Pack200 API。这些工具和 API 在 Java SE 11 中已被标记为过时,并明确表示将在未来的版本中移除。
向 Java 语言中添加文本块。文本块是一种多行字符串字面量,它避免了大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时给予开发者对格式的控制权。这是 JDK 14 中的一个预览语言功能。
引入一个 API,以允许 Java 程序安全高效地访问 Java 堆外的外部内存。
弃用 Parallel Scavenge 和 Serial Old 垃圾收集算法的组合。
JEP 305: Pattern Matching for instanceof (Preview)
根据 RFC 8032 的描述,使用 Edwards-Curve 数字签名算法(EdDSA)实现加密签名。
通过密封类和接口增强 Java 编程语言。密封类和接口限制了其他哪些类或接口可以扩展或实现它们。这是 JDK 15 中的预览语言功能。
引入了隐藏类,这些类无法被其他类的字节码直接使用。隐藏类旨在供在运行时生成类并通过反射间接使用它们的框架使用。隐藏类可以定义为访问控制巢的成员,并且可以独立于其他类进行卸载。
移除 Nashorn JavaScript 脚本引擎、相关 API 以及 jjs 工具。这些引擎、API 和工具在 Java 11 中已被标记为过时,并明确表示将在未来的版本中移除。
替换 java.net.DatagramSocket 和 java.net.MulticastSocket API 的底层实现,采用更简单、更现代的实现方式,使其易于维护和调试。新的实现将易于调整以与虚拟线程配合使用,虚拟线程目前正在 Project Loom 中进行探索。这是 JEP 353 的后续工作,JEP 353 已经重新实现了旧的 Socket API。
默认情况下禁用偏向锁,并弃用所有相关命令行选项。
通过为 instanceof 操作符添加模式匹配来增强 Java 编程语言。模式匹配允许程序中的常见逻辑,即从对象中条件性地提取组件,能够以更简洁、更安全的方式表达。这是 JDK 15 中的预览语言功能。
向 Java 语言添加文本块。文本块是一种多行字符串字面量,避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时给予开发者对格式的控制。
将 Shenandoah 垃圾收集器从实验性功能更改为产品功能。
引入一个 API,以允许 Java 程序安全高效地访问 Java 堆之外的外部内存。
通过记录(records)增强 Java 编程语言,记录是充当不可变数据的透明载体的类。记录可以被认为是名义元组。这是 JDK 15 中的预览语言功能。
将 Z 垃圾收集器从实验特性更改为产品特性。
移除 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口的源代码和构建支持。这些端口在 JDK 14 中已被弃用,并明确计划在未来的版本中移除。
弃用 RMI Activation 机制,以便未来删除。RMI Activation 是 RMI 中一个过时的部分,自 Java 8 起已成为可选项。RMI 的其他部分不会被弃用。
JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)
提供一个孵化器模块的初始迭代版本,jdk.incubator.vector,用于表达矢量计算,这些计算在支持的 CPU 架构上能够可靠地在运行时编译为最佳的矢量硬件指令,从而实现比等效标量计算更优越的性能。
允许在 JDK C++ 源代码中使用 C++14 语言特性,并就 HotSpot 代码中可以使用哪些特性提供具体指导。
将 OpenJDK 社区的源代码仓库从 Mercurial (hg) 迁移到 Git。
在 GitHub 上托管 OpenJDK 社区的 Git 仓库。结合 JEP 357(从 Mercurial 迁移到 Git),这将会把所有单一仓库的 OpenJDK 项目迁移到 GitHub,包括 JDK 特性发布版本以及 11 及更高版本的 JDK 更新发布版本。
将 ZGC 线程栈处理从安全点移动到并发阶段。
在 java.nio.channels 包中的 socket 通道和 server-socket 通道 API 中添加对 Unix 域(AF UNIX)套接字的支持。扩展继承的通道机制以支持 Unix 域套接字通道和服务器套接字通道。
将 JDK 移植到 Alpine Linux,以及使用 musl 作为其主要 C 库的其他 Linux 发行版,支持 x64 和 AArch64 架构。
更及时地将未使用的 HotSpot 类元数据(即,元空间)内存归还给操作系统,减少元空间占用空间,并简化元空间代码以降低维护成本。
将 JDK 移植到 Windows/AArch64。
引入一个 API,提供对原生代码的静态类型化、纯 Java 访问。这个 API 与 Foreign-Memory API(JEP 393)相结合,将大大简化原本容易出错的绑定到原生库的过程。
指定原始包装器类为基于值的类,并弃用它们的构造函数以便移除,从而引发新的弃用警告。针对在 Java 平台中任何基于值的类的实例上进行不当同步尝试的行为提供警告。
提供 jpackage 工具,用于打包自包含的 Java 应用程序。
引入一个 API,以允许 Java 程序安全高效地访问 Java 堆之外的外部内存。
增强 Java 编程语言,为 instanceof 操作符添加模式匹配功能。模式匹配允许程序中的常见逻辑,即从对象中条件性地提取组件,能够以更简洁、更安全的方式表达。
通过记录(records)增强 Java 编程语言,记录是一种充当不可变数据透明载体的类。可以将记录视为名义元组。
默认情况下,强烈封装 JDK 的所有内部元素,关键内部 API(例如 sun.misc.Unsafe)除外。允许最终用户选择自 JDK 9 以来默认的宽松强封装。
通过密封类和接口增强 Java 编程语言。密封类和接口限制了其他哪些类或接口可以扩展或实现它们。这是 JDK 16 中的预览语言功能。
JEP 338: Vector API (Incubator)
使浮点运算始终保持严格,而不是同时具有严格的浮点语义(strictfp)和略有不同的默认浮点语义。这将恢复语言和虚拟机的原始浮点语义,与在 Java SE 1.2 中引入严格和默认浮点模式之前的语义相匹配。
为伪随机数生成器(PRNG)提供新的接口类型和实现,包括可跳跃的 PRNG 和一类额外的可拆分 PRNG 算法(LXM)。
实现一个使用 Apple Metal API 的 macOS Java 2D 内部渲染管道,作为现有管道的替代方案,现有管道使用已弃用的 Apple OpenGL API。
将 JDK 移植到 macOS/AArch64。
弃用 Applet API 以供移除。由于所有浏览器厂商都已移除对 Java 浏览器插件的支持或宣布了移除计划,因此它基本上已经无关紧要。
强烈封装 JDK 的所有内部元素,关键内部 API(例如 sun.misc.Unsafe)除外。与 JDK 9 到 JDK 16 中的实现不同,不再可能通过单个命令行选项来放宽对内部元素的强封装。
通过为 switch 表达式和语句添加模式匹配,以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到 switch 可以使一个表达式根据多个模式进行测试,每个模式都有特定的操作,从而能够简洁且安全地表达以数据为导向的复杂查询。这是 JDK 17 中的预览语言功能。
移除远程方法调用(RMI)激活机制,同时保留 RMI 的其余部分。
通过密封类和接口增强 Java 编程语言。密封类和接口限制了其他哪些类或接口可以扩展或实现它们。
移除实验性的基于 Java 的提前编译(AOT)和即时编译(JIT)编译器。自从该编译器推出以来,使用率一直很低,而维护它所需的工作量却很大。保留实验性的 Java 级别 JVM 编译器接口(JVMCI),以便开发人员可以继续使用外部构建的编译器版本进行 JIT 编译。
在未来的版本中弃用安全管理员(Security Manager)。安全管理员起源于 Java 1.0。多年来,它已不再是保护客户端 Java 代码的主要手段,并且很少被用于保护服务器端代码。为了推动 Java 的发展,我们计划与旧的 Applet API(JEP 398)一起弃用安全管理员以便移除。
引入一个 API,通过它 Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过高效调用外部函数(即 JVM 之外的代码),以及安全访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用原生库并处理原生数据,而无需担心 JNI 的脆弱性和危险性。
引入一个 API,用于表达矢量计算,该 API 在支持的 CPU 架构上能够可靠地在运行时编译为最佳矢量指令,从而实现优于等效标量计算的性能。
允许应用程序通过 JVM 范围的过滤器工厂配置特定上下文和动态选择的反序列化过滤器,该工厂会在每次单独的反序列化操作时被调用以选择一个过滤器。
JEP 306: Restore Always-Strict Floating-Point Semantics
指定 UTF-8 作为标准 Java API 的默认字符集。通过这一变更,依赖于默认字符集的 API 将在所有实现、操作系统、区域设置和配置中表现一致。
提供一个命令行工具,用于启动仅提供静态文件的最小 Web 服务器。没有可用的 CGI 或类似 servlet 的功能。此工具在原型设计、即兴编码和测试方面非常有用,尤其是在教育环境中。
为 JavaDoc 的标准文档工具引入 @snippet 标签,以简化在 API 文档中包含示例源代码的操作。
引入一个 API,用于表达矢量计算,该 API 在支持的 CPU 架构上能够可靠地在运行时编译为最佳矢量指令,从而实现优于等效标量计算的性能。
定义一个用于主机名和地址解析的服务提供者接口(SPI),以便 java.net.InetAddress 可以使用除平台内置解析器之外的其他解析器。
引入一个 API,通过它 Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过高效调用外部函数(即 JVM 之外的代码),以及安全访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本地库并处理本地数据,而无需担心 JNI 的脆弱性和危险性。
通过为 switch 表达式和语句添加模式匹配,以及对模式语言的扩展,来增强 Java 编程语言。将模式匹配扩展到 switch 可以使一个表达式与多个模式进行匹配测试,每个模式都有特定的操作,从而能够简洁且安全地表达以数据为导向的复杂查询。这是 JDK 18 中的预览语言功能。
基于 java.lang.invoke 方法句柄重新实现 java.lang.reflect.Method、Constructor 和 Field。将方法句柄作为反射的底层机制,可以降低 java.lang.reflect 和 java.lang.invoke API 的维护与开发成本。
在未来版本中弃用并移除终止处理(finalization)。目前,默认情况下终止处理仍处于启用状态,但可以禁用以方便早期测试。在未来的版本中,它将默认被禁用,并在更晚的版本中被彻底移除。依赖终止处理的库和应用程序的维护者应考虑迁移到其他资源管理技术,例如 try-with-resources 语句和清理器(cleaners)。
JEP 400: UTF-8 by Default
通过记录模式来增强 Java 编程语言,以解构记录值。记录模式和类型模式可以嵌套使用,从而实现一种强大、声明式且可组合的数据导航与处理方式。这是一个预览语言特性。
将 JDK 移植到 Linux/RISC-V。
引入一个 API,通过它 Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过高效调用外部函数(即 JVM 之外的代码),以及安全访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本地库并处理本地数据,而无需担心 JNI 的脆弱性和危险性。这是一个预览版 API。
向 Java 平台引入虚拟线程。虚拟线程是一种轻量级线程,可以显著降低编写、维护和观察高吞吐量并发应用程序的难度。这是一个预览版 API。
引入一个 API,用于表达矢量计算,该 API 在支持的 CPU 架构上能够可靠地在运行时编译为最佳的矢量指令,从而实现优于等效标量计算的性能。
增强 Java 编程语言,使其在 switch 表达式和语句中支持模式匹配。将模式匹配扩展到 switch 可以让一个表达式与多个模式进行匹配,每个模式都有特定的操作,从而能够简洁且安全地表达以数据为导向的复杂查询。这是一个预览语言特性。
通过引入结构化并发的 API 来简化多线程编程。结构化并发将不同线程中运行的多个任务视为一个单一的工作单元,从而简化错误处理和取消操作,提高可靠性,并增强可观测性。这是一个孵化中的 API。
JEP 405: Record Patterns (Preview)
引入了作用域值(scoped values),它能够在线程内部和跨线程之间共享不可变数据。相比于线程局部变量,作用域值是更优的选择,尤其是在使用大量虚拟线程时。这是一个孵化中的 API。
通过记录模式来增强 Java 编程语言,以解构记录值。记录模式和类型模式可以嵌套使用,从而实现一种强大、声明式且可组合的数据导航和处理形式。这是一个预览语言特性。
增强 Java 编程语言,为 switch 表达式和语句添加模式匹配功能。将模式匹配扩展到 switch 可以使一个表达式根据多个模式进行测试,每个模式都有特定的操作,从而能够简洁且安全地表达以数据为导向的复杂查询。这是一个预览语言功能。
引入一个 API,通过它 Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过高效调用外部函数(即 JVM 之外的代码),以及安全访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本地库并处理本地数据,而无需像 JNI 那样脆弱且危险。这是一个预览版 API。
为 Java 平台引入虚拟线程。虚拟线程是一种轻量级线程,可显著减少编写、维护和观察高吞吐量并发应用程序的工作量。这是一个预览版 API。
通过引入结构化并发的 API 来简化多线程编程。结构化并发将不同线程中运行的多个任务视为一个工作单元,从而简化错误处理和取消操作,提高可靠性并增强可观测性。这是一个孵化中的 API。
引入一个 API,用于表达矢量计算,该 API 在支持的 CPU 架构上能够可靠地在运行时编译为最佳的矢量指令,从而实现优于等效标量计算的性能。
引入 范围值,它允许在线程内和线程间共享不可变数据。与线程局部变量相比,范围值更为优先,尤其是在使用大量虚拟线程时。这是一个孵化中的API。
引入新的接口来表示具有确定遭遇顺序的集合。每个这样的集合都有一个明确的第一个元素、第二个元素,依此类推,直到最后一个元素。它还提供了用于访问其第一个和最后一个元素的统一 API,并按相反顺序处理其元素。
通过扩展 Z 垃圾收集器(ZGC)以维护年轻对象和老对象的单独代际,来提升应用程序性能。这将允许 ZGC 更频繁地收集通常会较快消亡的年轻对象。
通过记录模式来增强 Java 编程语言,以解构记录值。记录模式和类型模式可以嵌套,从而实现一种强大、声明式且可组合的数据导航和处理形式。
增强 Java 编程语言,使其在 switch 表达式和语句中支持模式匹配。将模式匹配扩展到 switch 可以使一个表达式根据多个模式进行测试,每个模式都有特定的操作,从而能够简洁且安全地表达复杂的数据导向查询。
引入一个 API,通过它 Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过高效调用外部函数(即 JVM 之外的代码),以及安全地访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用原生库并处理原生数据,而无需担心 JNI 的脆弱性和危险性。这是一个预览版 API。
通过未命名模式增强 Java 语言,该模式可以在不声明组件名称或类型的情况下匹配记录组件,并且可以初始化但不使用的未命名变量。两者均通过下划线字符 \_ 表示。这是一个预览语言功能。
向 Java 平台引入虚拟线程。虚拟线程是一种轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。
引入了作用域值,这是一种可以安全且高效地共享给方法的值,而无需使用方法参数。它们比线程局部变量更受青睐,尤其是在使用大量虚拟线程时。这是一个预览 API。
引入一个 API,用于表达矢量计算,该 API 在支持的 CPU 架构上能够可靠地在运行时编译为最佳的矢量指令,从而实现优于等效标量计算的性能。
当代理被动态加载到正在运行的 JVM 中时发出警告。这些警告旨在让用户为未来的版本做好准备,在该版本中为了提高默认的完整性,将默认禁止动态加载代理。在启动时加载代理的服务工具不会导致任何版本发出警告。
引入一个用于密钥封装机制(KEMs)的 API,这是一种使用公钥加密技术来保护对称密钥的加密方法。
通过字符串模板增强 Java 编程语言。字符串模板通过将文本字面量与嵌入式表达式和模板处理器相结合,从而补充了 Java 现有的字符串字面量和文本块,以生成专门的结果。这是一个预览语言特性及 API。
改进 Java 语言,让学生在不需要理解专为大型程序设计的语言特性的情况下,就能编写他们的第一个程序。学生可以使用简化的声明来编写单类程序,而不用使用 Java 的另一种方言,然后随着技能的提升,无缝扩展他们的程序以使用更高级的功能。这是一个预览语言功能。
弃用 Windows 32 位 x86 端口,并计划在未来版本中将其移除。
通过引入结构化并发的 API 来简化并发编程。结构化并发将不同线程中运行的相关任务组视为一个工作单元,从而简化错误处理和取消操作,提高可靠性并增强可观测性。这是一个预览版 API。
JEP 430: String Templates (Preview)
通过在 G1 中实现区域固定来减少延迟,这样在 Java 本地接口(JNI)关键区域期间就不需要禁用垃圾回收。
在 Java 编程语言的构造函数中,允许在显式构造函数调用之前出现未引用正在创建的实例的语句。这是一个预览语言功能。
引入一个 API,通过它 Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过高效调用外部函数(即 JVM 之外的代码),以及安全访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用原生库并处理原生数据,而无需像 JNI 那样脆弱且危险。
通过使用下划线字符 \_ 来增强 Java 编程语言,加入未命名变量和未命名模式,这在需要变量声明或嵌套模式但从未使用它们时非常有用。
提供一个用于解析、生成和转换 Java 类文件的标准 API。这是一个预览版 API。
增强 Java 应用程序启动器,使其能够运行以多份 Java 源代码文件形式提供的程序。这将使从小型程序过渡到大型程序的过程更加平缓,使开发人员可以选择是否以及何时去配置构建工具。
通过字符串模板增强 Java 编程语言。字符串模板通过将文本字面量与嵌入式表达式和模板处理器相结合,从而补充了 Java 现有的字符串字面量和文本块,以生成专门的结果。这是一个预览语言功能和 API。
引入一个 API,用于表达矢量计算,该 API 在支持的 CPU 架构上能够可靠地在运行时编译为最佳矢量指令,从而实现优于等效标量计算的性能。
增强 Stream API,以支持自定义的中间操作。这将允许流管道以现有内置中间操作不易实现的方式转换数据。这是一个预览版 API。
通过引入结构化并发的 API 来简化并发编程。结构化并发将不同线程中运行的相关任务组视为一个工作单元,从而简化错误处理和取消操作,提高可靠性并增强可观测性。这是一个预览版 API。
改进 Java 编程语言,以便学生在无需理解专为大型程序设计的语言特性的情况下,就能编写他们的第一个程序。学生可以使用简化的声明来编写单类程序,而不用使用该语言的单独方言,然后随着技能的增长,无缝扩展他们的程序以使用更高级的功能。这是一个预览语言特性。
引入了作用域值(scoped values),它能够实现与同一线程中的子帧以及子线程之间的不可变数据的受控共享。作用域值比线程局部变量更容易理解,并且在空间和时间成本上更低,尤其是在与虚拟线程(Virtual Threads)和结构化并发(Structured Concurrency)结合使用时。这是一个预览版 API。
JEP 423: Region Pinning for G1
启用 JavaDoc 文档注释以 Markdown 格式编写,而不是仅仅使用 HTML 和 JavaDoc @-标签的混合形式。
引入一个 API,用于表达矢量计算,该 API 在支持的 CPU 架构上能够可靠地在运行时编译为最佳的矢量指令,从而实现优于等效标量计算的性能。
增强 Java 编程语言,使其能够简洁地导入模块导出的所有包。这简化了模块化库的重用,但不要求导入代码本身位于模块中。这是一个预览语言功能。
通过在所有模式上下文中允许基本类型模式来增强模式匹配,并扩展 instanceof 和 switch 以适用于所有基本类型。这是一个预览语言功能。
提供一个用于解析、生成和转换 Java 类文件的标准 API。这是一个预览版 API。
弃用 sun.misc.Unsafe 中的内存访问方法,并计划在未来的版本中移除这些方法。这些不受支持的方法已经被标准 API 取代,即 VarHandle API(JEP 193,JDK 9)和 Foreign Function & Memory API(JEP 454,JDK 22)。我们强烈建议库开发者从 sun.misc.Unsafe 迁移到受支持的替代方案,以便应用程序能够顺利迁移到现代的 JDK 版本。
增强 Stream API,以支持自定义的中间操作。这将允许流管道以现有内置中间操作不易实现的方式转换数据。这是一个预览版 API。
将 Z 垃圾收集器(ZGC)的默认模式切换为分代模式。弃用非分代模式,并计划在未来版本中将其移除。
改进 Java 编程语言,以便初学者可以在不需要理解专为大型程序设计的语言特性的情况下编写他们的第一个程序。初学者无需使用该语言的单独方言,而是可以为单类程序编写简化的声明,然后随着技能的增长无缝扩展其程序以使用更高级的功能。经验丰富的开发人员同样可以享受简洁地编写小程序的乐趣,而无需使用旨在大规模编程的结构。这是一个预览语言功能。
通过引入结构化并发的 API 来简化并发编程。结构化并发将不同线程中运行的相关任务组视为一个工作单元,从而简化错误处理和取消操作,提高可靠性并增强可观测性。这是一个预览版 API。
引入了作用域值(scoped values),使方法能够在线程内的被调用者以及子线程之间共享不可变数据。与线程局部变量相比,作用域值更易于理解。它们在空间和时间成本上也更低,特别是与虚拟线程(JEP 444)和结构化并发(JEP 480)一起使用时。这是一个预览 API。
在 Java 编程语言的构造函数中,允许在显式构造函数调用(即 super(..) 或 this(..))之前出现语句。这些语句不能引用正在构造的实例,但可以初始化其字段。在调用另一个构造函数之前初始化字段,当方法被重写时,可以使类更加可靠。这是一个预览语言特性。
JEP 455: Primitive Types in Patterns, instanceof, and switch (Preview)
JEP 404: Generational Shenandoah (Experimental)
顺利扩展方法类型推断的范围,以支持 (i) 方法上下文中的推断和 (ii) 链式调用中的推断。
向 `java.util.Arrays` 添加额外的实用方法,这些方法使用 JSR 166 的 Fork/Join 并行通用池来提供数组的并行排序功能。
扩展 Java 编程语言语法中可注解位置的集合,以包括指示类型使用情况的名称,以及(根据 Java SE 5.0)类型的声明。
扩展 javax.tools API 以提供对 javadoc 的访问。
为 Java 集合框架(Java Collections Framework)添加用于数据批量操作的功能。这通常被称为“Java 的 filter/map/reduce”。批量数据操作包括串行(在调用线程上执行)和并行(使用多线程)两种版本的操作。数据操作通常以 lambda 函数的形式表达。
使用新的 lambda 语言功能增强 Java 核心库 API,以提高库的可用性和便利性。
改善标准和扩展字符集实现的可维护性与性能。
添加对 TLS 服务器名称指示 (SNI) 扩展的支持,以允许基于 SSL/TLS 协议的更灵活的安全虚拟主机和虚拟机基础设施。
支持由 SP-800-380D、RFC 5116、RFC 5246、RFC 5288、RFC 5289 和 RFC 5430 定义的 AEAD/GCM 加密套件。
从 JDK 中移除 apt 工具、相关 API 以及文档。
提供一种机制,通过核心反射在运行时轻松可靠地检索方法和构造函数的参数名称。
提供一个由核心反射(core reflection)而非 javac 支持的 `javax.lang.model.*` API 实现。换句话说,提供一个替代 API,用于访问和处理由核心反射提供的已加载类的反射信息。
更改 Java 编程语言,以允许对单个程序元素多次应用相同类型的注解。
在 SunJCE 提供程序中提供更强的基于密码的加密(PBE)算法实现。
移除 Hotspot JVM 中的永久代,从而无需调整永久代的大小。
增强用于安全随机数生成的 API,使其能够配置为在指定的质量和响应性约束条件下运行。
改进证书吊销检查 API,以支持尽力而为的检查、终端实体证书检查以及特定机制的选项和参数。
在 Java 编程语言和平台中添加 lambda 表达式(闭包)及支持的功能,包括方法引用、增强的类型推断以及虚拟扩展方法。
定义 API,以便使用 BCP 47 语言标签(参见 RFC 5646)的应用程序能够按照符合 RFC 4647 的方式将其与用户的语言偏好相匹配。
提供 NSA Suite B 所需的加密算法的实现。
实现 SHA-224 消息摘要算法及相关算法。
定义 Base64 编码和解码的标准 API。
提供有关字节码验证错误的更多上下文信息,以帮助诊断现场中的字节码或堆栈映射缺陷。
通过修改 Java 编译器,使其在单个持久进程中运行于所有可用核心上,跟踪构建之间的包和类依赖关系,自动生成本地方法的头文件,并清理不再需要的类和头文件,从而减少构建 JDK 所需的时间并启用增量构建。
启用代码以声明其部分特权,而不会阻止完整的访问控制堆栈遍历来检查其他权限。
定义一种方式,用于指定对象中的一个或多个字段可能在处理器核心之间存在高度争用,以便虚拟机(VM)可以安排这些字段不与其他可能被独立访问的字段或其他对象共享缓存行。
减少 HotSpot 的类元数据内存占用,以提高小型设备上的性能。
支持创建一个不大于 3 MB 的小型虚拟机。
减少核心库类使用的动态内存,同时不会对性能产生不利影响。
为 Java SE 平台定义一个新的日期、时间和日历 API。
增强 Java 命令行启动器以启动 JavaFX 应用程序。
可扩展的可更新变量、针对缓存的 ConcurrentHashMap API 增强、ForkJoinPool 改进,以及额外的 Lock 和 Future 类。
通过使用可优化的中间表示替换汇编语言路径来改进方法句柄的实现,然后重构实现,使得更多的工作可以在可移植的 Java 代码中完成,而不是硬编码到 JVM 中。
定义 Java SE 平台规范的几个子集 Profiles,以便不需要整个平台的应用程序可以在小型设备上部署和运行。
进行一些更改,以顺利过渡到未来版本中的模块化,提供新工具来帮助开发者为模块化平台做好准备,并弃用某些对模块化有重大阻碍的 API。
通过在 PKCS#12 密钥库中添加等效支持,来促进从 JKS 和 JCEKS 密钥库迁移数据。增强 KeyStore API 以支持新功能,例如条目元数据和跨越多个密钥库的逻辑视图。启用 JEP-121 中引入的强加密算法,以保护密钥库条目。
对 JDBC 的次要增强以提高可用性和可移植性
在 `sun.misc.Unsafe` 类中添加三个内存排序内在函数。
移除三种很少使用的垃圾收集器组合,以降低持续的开发、维护和测试成本。
设计并实现一种新的轻量级、高性能的 JavaScript 实现,并将其集成到 JDK 中。这个新的引擎将通过现有的 `javax.script` API 提供给 Java 应用程序使用,同时也会更广泛地通过一个新的命令行工具提供支持。
增强 JNI 规范以支持静态链接的本地库。
JDK 长期以来一直存在一个缺陷,即未能明确指定 **com.sun.\*** 类型以及 JDK 中随附的其他非 Java SE 规范类型的支持和稳定性使用约定。这些约定以及潜在的演进策略应当在这些类型的源代码和生成的类文件中清晰地体现出来。这类信息可以通过 JDK 特定的注解类型进行建模。
通过使用平衡树而不是链表来存储映射条目,提高在高哈希冲突条件下 `java.util.HashMap` 的性能。在 `LinkedHashMap` 类中实现相同的改进。
定义一种新型的网络权限,该权限通过 URL 而不是低级别的 IP 地址来授予访问权限。
增强 JAXP API,增加限制可用于获取外部资源的网络协议集的功能。
改进用于控制和管理操作系统进程的 API。
定义一个新的 HTTP 客户端 API,该 API 实现了 HTTP/2 和 WebSocket,并能够替代旧的 `HttpURLConnection` API。该 API 将作为孵化器模块交付,依据 JEP 11 的定义,随 JDK 9 提供。这意味着:
改进有争用的 Java 对象监视器的性能。
为 JVM 的所有组件引入一个通用的日志系统。
这个 JEP 提出了一种改进的方式来控制 JVM 编译器。它启用了运行时可管理的、依赖于方法的编译器标志。(在编译期间不可变。)
定义一个标准方法,用于在对象字段和数组元素上调用各种 `java.util.concurrent.atomic` 和 `sun.misc.Unsafe` 操作的等效操作,定义一套标准的围栏操作以实现对内存排序的细粒度控制,并定义一个标准的可达性围栏操作,以确保被引用的对象保持强可达性。
将代码缓存划分为不同的段,每个段包含特定类型的编译代码,以提高性能并支持未来的扩展。
改进 sjavac 工具,使其可以默认在 JDK 构建中使用,并将其通用化,以便可以用于构建除 JDK 以外的大型项目。
使用由 JSR 376 指定并由 JEP 261 实现的 Java 平台模块系统来模块化 JDK。
将 JDK 源代码重组为模块,增强构建系统以编译模块,并在构建时强制执行模块边界。
从 Java SE 8 开始,根据对《Java 语言规范》的合理解释,java 编译器在通过名称导入已弃用的类型或静态导入已弃用的成员(方法、字段、嵌套类型)时,需要发出弃用警告。这些警告信息并不具备足够的参考价值,因此不应强制要求。在实际使用已弃用成员时,仍然应该保留弃用警告。
JDK 代码库包含大量由 `javac` 报告的 lint 和 doclint 错误。这些问题应该得到解决,至少要解决平台基础部分的相关警告。
作为 JDK 7 / Java SE 7 的一部分,Project Coin / JSR 334 中包含的小型语言变更易于使用,并在实践中运作良好。然而,一些修正案可以解决这些变更中的不完善之处。此外,在 Java SE 8 中将下划线("_")用作标识符会生成警告,而在 Java SE 9 中应将其转变为错误。还建议允许接口拥有私有方法。
移除之前在 JDK 8 中通过 JEP 173 弃用的 GC 组合。
在 javac 中实施一种新的方法类型检查策略,以加快参数位置中多态表达式的属性处理速度。
修复 `javac`,使其能够正确接受和拒绝程序,而不论 `import` 语句以及 `extends` 和 `implements` 子句的顺序如何。
重新设计 `javac` 注解管道,以更好地满足注解的需求以及处理注解的工具的需求。
定义数据报传输层安全 (DTLS) 协议版本 1.0(RFC 4347)和版本 1.2(RFC 6347)的 API。
重组 JDK 和 JRE 的运行时镜像,以适应模块化并提升性能、安全性和可维护性。定义一种新的 URI 模式,用于命名存储在运行时镜像中的模块、类和资源,同时不暴露镜像的内部结构或格式。根据需要修订现有规范以适应这些更改。
提供一个替代的 Doclet API,以利用适当的 Java SE 和 JDK API,并更新标准 doclet 以使用新的 API。
提供一个交互式工具,用于评估 Java 编程语言的声明、语句和表达式,并附带一个 API,以便其他应用程序可以利用此功能。
定义一个版本字符串方案,可以轻松区分主要版本、次要版本和安全更新版本,并将其应用于 JDK。
增强 javadoc 工具以生成 HTML5 标记。
在由标准 doclet 生成的 API 文档中添加一个搜索框,可以用于搜索文档中的程序元素以及带标签的单词和短语。该搜索框会出现在由标准 doclet 生成的所有页面的头部。
定义一种方法,让应用程序可以指定使用 UTF-8 编码的属性文件,并扩展 ResourceBundle API 以加载这些文件。
升级现有平台 API,以支持 Unicode 标准的 7.0 版本。
定义额外的诊断命令,以提高 Hotspot 和 JDK 的可诊断性。
将默认的密钥库类型从 JKS 转换为 PKCS12。
移除在 JRE 启动时请求非启动中的 JRE 版本的功能。
改进安装了安全经理后运行的应用程序的性能。
开发一个工具,通过自动生成测试用例来测试运行时编译器。
编写测试以验证 `javac` 生成的类文件属性的正确性。
为 Nashorn 的 ECMAScript 抽象语法树定义一个受支持的 API。
将 JDK 9 移植到 Linux/AArch64。
扩展 JAR 文件格式,以允许特定于多个 Java 发行版的类文件版本共存于单个归档文件中。
从 JDK 中移除 hprof 代理。
移除过时的 jhat 工具。
开发一个基于 Java 的 JVM 编译器接口(JVMCI),使 JVM 能够将用 Java 编写的编译器作为动态编译器使用。
扩展 `javax.net.ssl` 包以支持 TLS 应用层协议协商 (ALPN) 扩展,该扩展提供了为 TLS 连接协商应用层协议的手段。
验证所有 JVM 命令行标志的参数,以避免崩溃,并确保在参数无效时显示适当的错误消息。
通过利用最近引入的 SPARC 和 Intel x64 CPU 指令,提升 GHASH 和 RSA 加密操作的性能。
增强 `javac`,使其能够编译 Java 程序以在选定的旧版本平台上运行。
在 32 位和 64 位服务器配置上将 G1 设置为默认的垃圾收集器。
通过 TLS 证书状态请求扩展(RFC 6066 的第 8 节)和多证书状态请求扩展(RFC 6961)来实现 OCSP 装订。
在类数据共享(CDS)存档中存储实习字符串。
定义一个多分辨率图像 API,以便可以轻松操纵和显示具有分辨率变体的图像。
默认情况下,使用来自 Unicode 联盟的通用区域设置数据存储库(CLDR)的区域设置数据。
为 JavaFX UI 控件和 CSS 功能定义公共 API,这些功能目前只能通过内部 API 获得,因此由于模块化的原因将变得不可访问。
采用更节省空间的字符串内部表示形式。
升级 JDK 中包含的 Xerces XML 解析器的版本,并从 Xerces 2.11.0 中引入重要变更。
将 @beaninfo Javadoc 标签替换为适当的注解,并在运行时处理这些注解以动态生成 BeanInfo 类。
更新 FX/Media 中包含的 GStreamer 版本,以提高安全性、稳定性和性能。
用 HarfBuzz 替换现有的 ICU OpenType 字体布局引擎。
为栈遍历定义一个高效的标准化 API,允许轻松过滤栈跟踪中的信息,并按需访问这些信息。
默认情况下,封装大多数 JDK 的内部 API,以便在编译时无法访问它们,并为未来版本中运行时也无法访问它们做好准备。确保关键且广泛使用的内部 API 不被封装,以便在存在对其全部或大部分功能支持的替代方案之前,它们仍然可以被访问。
实现由 JSR 376 指定的 Java 平台模块系统,以及相关的 JDK 特定变更和增强功能。
扩展标准的 Image I/O 插件集以支持 TIFF 图像格式。
在 Windows 和 Linux 上实现 HiDPI 图形。
定义一个最小的日志记录 API,平台类可以使用该 API 来记录消息,并为这些消息的使用者提供一个服务接口。库或应用程序可以提供此服务的一个实现,以便将平台日志消息路由到其所选择的日志框架。如果没有提供实现,则会使用基于 `java.util.logging` API 的默认实现。
更新 Java 2D,以使用 Marlin 渲染器作为默认的图形光栅化器。
一个可互操作的发布-订阅框架、对 CompletableFuture API 的增强以及各种其他改进。
升级现有平台 API,以支持 Unicode 标准的 8.0 版本。
开发一个支持 OASIS XML 目录标准 v1.1 的标准 XML 目录 API。该 API 将定义目录和目录解析器抽象,可以与接受解析器的 JAXP 处理器一起使用。
定义库 API,以便于创建包含少量元素的集合和映射实例,从而缓解 Java 编程语言中没有集合字面量的不便。
为关键部分在线程栈上预留额外的空间,以便在栈溢出发生时它们仍能完成操作。
使用 JEP 158 中引入的统一 JVM 日志记录框架重新实现 GC 日志记录。
定义一个新的公共 API,以访问特定于平台的桌面功能,例如与任务栏或程序坞进行交互,或者监听系统或应用程序事件。
实现 NIST 800-90Ar1 中描述的三种确定性随机比特生成器 (DRBG) 机制。
增强 `java.lang.invoke` 包中的 `MethodHandle`、`MethodHandles` 和 `MethodHandles.Lookup` 类,通过新的 `MethodHandle` 组合器和查找细化来简化常见用例,并实现更好的编译器优化。
将 Project Jigsaw 的功能集成到 Java Packager 中,包括模块感知和自定义运行时创建。
提供一种机制,用于将对象上的高级操作(例如“读取属性”、“写入属性”、“调用可调用对象”等)链接起来,这些操作在 `INVOKEDYNAMIC` 调用点中以名称形式表达。为普通 Java 对象的这些操作提供默认链接器以支持其常见语义,同时提供一种安装语言特定链接器的机制。
改进 @Deprecated 注解,并提供工具来加强 API 生命周期。
为 G1 垃圾收集器的超大对象(Humongous Objects)功能开发额外的白盒测试。
自动收集诊断信息,以便在测试失败和超时时用于进一步的故障排除。
将 `javac` 生成的静态字符串连接字节码序列更改为使用 `invokedynamic` 调用 JDK 库函数。这将使得未来可以对字符串连接进行优化,而无需对 `javac` 生成的字节码进行进一步更改。
启用并鼓励为 HotSpot 开发 C++ 单元测试。
创建一个工具,该工具可以按照 JEP 220 的定义,将一组模块及其依赖项组装并优化为自定义的运行时镜像。
在 Linux 上启用基于 JavaFX、Swing 或 AWT 的 Java 图形应用程序以使用 GTK 2 或 GTK 3。
使用 build-infra 框架重写 HotSpot 构建系统。
定义一个 API,以允许 Java 代码提示正在执行自旋循环。
实现 NIST FIPS 202 中指定的 SHA-3 加密哈希函数(仅限字节模式)。
通过提供一种更灵活的机制来禁用基于 SHA-1 签名的 X.509 证书链,从而提升 JDK 的安全配置。
废弃 Applet API,随着 web 浏览器供应商移除对 Java 浏览器插件的支持,该 API 正迅速变得无关紧要。引导开发人员使用其他技术,例如 Java Web Start 或可安装的应用程序。
允许对对象序列化数据的传入流进行过滤,以提高安全性和鲁棒性。
弃用并发标记清除(CMS)垃圾收集器,目的是在未来的重大版本中停止对它的支持。
在 Nashorn 中实现第六版 ECMA-262(也称为 ECMAScript 6 或简称 ES6)引入的许多新特性中的选定部分。
将 JDK 9 移植到 Linux/s390x。
在启动虚拟机之前,将 Java 类编译为本地代码。
将 Oracle 贡献的 HotSpot 的 arm32 和 arm64 统一端口集成到 JDK 中。
删除过时且未维护的演示和示例。
更新 JDK 中文档的组织结构,包括源代码仓库和生成的文档。
JEP 102: Process API Updates
扩展编译器树 API,以提供对 javadoc 注释内容的结构化访问。
扩展现有平台 API,以支持 Unicode 标准的 6.2 版本。
提供一种方法,在开发周期的早期检测 Javadoc 注释中的错误,并且能够轻松链接回源代码。
引入 autoconf(./configure 风格)构建设置,重构 Makefile 以消除递归,并利用 JEP 139:增强 javac 以提高构建速度。
增强 Shenandoah 垃圾收集器的实验性分代收集功能,以提高可持续吞吐量、负载峰值恢复能力和内存利用率。
将 HotSpot JVM 中对象头的大小从 96 到 128 位减少到 64 位架构下的 64 位。这将减少堆大小,提高部署密度,并增加数据局部性。
对 Java Native Interface (JNI) 的使用发出警告,并调整 Foreign Function & Memory (FFM) API 以一致的方式发出警告。所有这些警告旨在让开发人员为未来的版本做好准备,该版本将通过统一限制 JNI 和 FFM API 来默认确保完整性。应用程序开发人员可以通过在必要时选择性地启用这些接口来避免当前的警告和未来的限制。
通过将 G1 垃圾收集器的屏障(记录应用程序内存访问信息)的扩展从 C2 JIT 编译管道的早期移到后期,来简化其实现。
介绍一种用于密钥导出函数(KDFs)的 API,这是一种从密钥和其他数据中导出额外密钥的加密算法。这是一个预览版 API。
移除 Windows 32 位 x86 端口的源代码和构建支持。该端口在 JDK 21 中已被标记为过时,并明确表示将在未来的版本中移除。
通过使应用程序的类在 HotSpot Java 虚拟机启动时立即可用(处于已加载和已链接状态)来改进启动时间。通过在一次运行中监视应用程序并存储所有类的已加载和已链接形式到缓存中,以便在后续运行中使用,从而实现这一点。为将来对启动时间和预热时间的改进奠定基础。
提供用于解析、生成和转换 Java 类文件的标准 API。
增强 Stream API 以支持自定义中间操作。这将允许流管道以现有内置中间操作难以实现的方式转换数据。
Security Manager 多年来一直不是保护客户端 Java 代码的主要手段,也很少被用来保护服务器端代码,并且维护成本很高。因此,我们在 Java 17 中通过 JEP 411(2021)将其标记为废弃,准备移除。作为移除 Security Manager 的下一步,我们将修订 Java 平台规范,使开发人员无法启用它,并且其他平台类不会引用它。这一变更对绝大多数应用程序、库和工具没有影响。我们将在未来的版本中移除 Security Manager API。
介绍作用域值,它使方法能够在单个线程中与其调用者以及子线程共享不可变数据。作用域值比线程局部变量更容易理解。它们还具有更低的空间和时间成本,尤其是在与虚拟线程(JEP 444)和结构化并发(JEP 480)一起使用时。这是一个预览 API。
通过允许在所有模式上下文中使用基本类型,并扩展 instanceof 和 switch 以支持所有基本类型,来增强模式匹配。这是一个预览语言特性。
介绍一种 API,用于表达向量计算,该 API 可以在支持的 CPU 架构上可靠地编译为最佳的向量指令,从而实现优于等效标量计算的性能。
移除 Z 垃圾收集器(ZGC)的非世代模式。
通过安排在这些结构中阻塞的虚拟线程释放其底层平台线程以供其他虚拟线程使用,来提高使用同步方法和语句的 Java 代码的可扩展性。这将消除几乎所有虚拟线程被固定到平台线程的情况,这种情况会严重限制可用于处理应用程序工作负载的虚拟线程数量。
在 Java 编程语言的构造函数中,允许在显式的构造函数调用(即 super(..) 或 this(..))之前出现语句。这些语句不能引用正在构建的实例,但它们可以初始化其字段。在调用另一个构造函数之前初始化字段可以使类在方法被重写时更可靠。这是一个预览语言特性。
通过启用 jlink 工具来创建自定义运行时镜像,而无需使用 JDK 的 JMOD 文件,从而将 JDK 的大小减少约 25%。此功能必须在构建 JDK 时启用;默认情况下不会启用,并且某些 JDK 供应商可能会选择不启用它。
增强 Java 编程语言,使其能够简洁地导入模块导出的所有包。这简化了模块化库的重用,但不要求导入代码本身位于一个模块中。这是一个预览语言特性。
使 Java 编程语言得以发展,以便初学者可以在不需要理解为大型程序设计的语言特性的情况下编写他们的第一个程序。初学者可以为单类程序编写简化的声明,然后随着技能的提高无缝地扩展他们的程序以使用更高级的特性。有经验的开发者也可以喜欢简洁地编写小型程序,而不需要使用为大型编程设计的结构。这是一个预览语言特性。
通过提供抗量子的基于模块格的密钥封装机制(ML-KEM)的实现来增强 Java 应用程序的安全性。密钥封装机制(KEMs)用于使用公钥加密技术在不安全的通信信道上保护对称密钥。ML-KEM 被设计为能够抵御未来的量子计算攻击。它已被美国国家标准与技术研究院(NIST)在 FIPS 203 中标准化。
通过提供抗量子模块格数字签名算法(ML-DSA)的实现来增强 Java 应用程序的安全性。数字签名用于检测对数据未经授权的修改,并验证签署人的身份。ML-DSA 被设计为能够抵御未来的量子计算攻击。它已被美国国家标准与技术研究院(NIST)在 FIPS 204 中标准化。
在运行时首次调用 sun.misc.Unsafe 中的任何内存访问方法时发出警告。这些不受支持的方法在 JDK 23 中已被彻底弃用。它们已经被标准 API 所取代,即 VarHandle API(JEP 193,JDK 9)和 Foreign Function & Memory API(JEP 454,JDK 22)。我们强烈建议库开发者从 sun.misc.Unsafe 迁移到受支持的替代方案,以便应用程序可以顺利迁移到现代的 JDK 版本。
通过引入结构化并发的 API 来简化并发编程。结构化并发将运行在不同线程中的相关任务组视为一个工作单元,从而简化错误处理和取消操作,提高可靠性,并增强可观察性。这是一个预览版 API。
弃用 32 位 x86 端口,并打算在未来的版本中移除它。这将因此弃用 JDK 中唯一剩余的 Linux 32 位 x86 端口。这实际上也将弃用任何剩余的下游 32 位 x86 端口。在 32 位 x86 端口被移除后,与架构无关的 Zero 端口将是运行 32 位 x86 处理器上 Java 程序的唯一方式。
将 MS-SFU 扩展添加到 JDK 的 Kerberos 5 实现中。
创建一个工具,将 LDML(Locale Data Markup Language)文件转换为可直接供运行时库使用的格式,定义一种将结果打包为模块的方法,然后利用这些内容将 Unicode 联盟的 CLDR 项目发布的事实标准区域设置数据整合到 JDK 中。
在适用于 64 位 Windows 的 JDK 中包含 SunPKCS11 提供程序。
通过在可用时使用 x86 AES 指令,并避免不必要的 AES 密钥重新扩展,从而提升开箱即用的 AES 加密性能。
通过用一种能够准确识别调用敏感方法并可靠地发现其调用者的机制,来取代现有的手动维护的调用敏感方法列表,从而提高 JDK 方法句柄实现的安全性。
通过利用整数和浮点运算的数值属性,优化 `java.text.DecimalFormat.format`,以加速小数点后有两位或三位数字的情况。
JDK8共更新55个新特性。部分重要特性会在后续的文章中单独介绍。特性列表如下