Java 27 在 IntelliJ IDEA 中的支持与新特性
按照六个月发布周期,Java 27 已于 2026 年 9 月 15 日发布。在这篇博文中,我们将了解这个版本包含哪些内容、IntelliJ IDEA 如何持续支持最新的 Java 版本,甚至 IntelliJ IDEA 如何从 JDK 的某些变化中获益。
Java 27 带来了九个 JEP,其中四个是正式(final)特性。此外,四个预览特性继续走向成熟,一个 JEP 仍作为孵化器特性存在。
即使你不使用 IntelliJ IDEA,也能在其他地方获得它的智能能力:IntelliJ IDEA 走向 LSP:Java 与 Kotlin 智能能力来到 VS Code、Cursor 和智能体工作流。它为最新的 Java 版本与特性提供同等水平的支持,包括早期访问版本和预览特性。
在本文中,我们先从配置 IntelliJ IDEA 以使用最新 Java 版本开始。
在 IntelliJ IDEA 中使用 Java 27(环境配置)
首先,你需要下载 JDK 27。有多种方式可以做到这一点:你可以在 IntelliJ IDEA 内部下载,使用 SDKMAN! 或 asdf 之类的工具,或者自行安装。
下载 JDK
要在 IntelliJ IDEA 中下载 JDK 27,请打开项目结构(Project Structure),进入项目设置 | 项目(Project Settings | Project)选项卡,打开 SDK 字段的下拉菜单,然后选择下载 JDK(Download JDK)。在打开的下载 JDK 弹窗中,将*版本(Version)设为 27,并在供应商(Vendor)*字段中选择你想使用的供应商。
[LOADING...] 下载 JDK [LOADING...] 下载 JDK —— 选择供应商
如果你已经安装了 JDK,可以让 IntelliJ IDEA 指向你的安装位置。此时改为在下拉菜单中选择从磁盘添加 JDK(Add JDK from Disk)。
[LOADING...] 从磁盘添加 JDK
JDK 版本会自动从你的项目设置传播到终端,这意味着你和你的智能体都能在 IntelliJ IDEA 的终端中为项目使用正确的 JDK。该特性的演示可在 IntelliJ IDEA 2026.2 新特性视频中查看。
如果你使用 SDKMAN! 或 asdf 管理 JDK,IntelliJ IDEA 可以读取项目中的 .sdkmanrc 或 .tool-versions 文件,并在你已安装该 JDK 的情况下自动完成配置。
如果你使用 SDKMAN!,而 .sdkmanrc 文件中指定的 JDK 版本尚未安装,文件中会出现一条内嵌提示(inlay hint),让你可以直接在 IDE 中运行相应的 SDKMAN! 命令来下载它。即使你没有安装 SDKMAN!,这一点也同样适用,因此该功能对 Windows 用户也可用。
有关如何设置 JDK 的更多信息,请参阅文档。
设置语言级别
IntelliJ IDEA 从第一天起就支持 Java 27。在项目结构中,将*语言级别(Language level)*设为 27 -- No new language features。
[LOADING...] 27 -- No new language features
如果你要使用预览特性,请将其设为 27 (Preview) -- Primitive types in patterns, instanceof, and switch (5th preview)。请注意,IntelliJ IDEA 会在编辑器中高亮显示预览特性的使用位置,以便你清楚地知道自己在哪些地方使用了预览特性。
[LOADING...] 27 (Preview) -- Primitive types in patterns, instanceof, and switch (5th preview)
Java 27 中新的正式特性
Java 27 引入了 4 个新的正式特性。让我们快速了解一下。
JEP 523:在所有环境中将 G1 设为默认垃圾收集器
Garbage-First(G1)垃圾收集器自 Java 9 起一直是默认垃圾收集器,只有一个例外:仅有单个 CPU 或内存不足 1,792 MB 的机器会回退到 Serial GC。该 JEP 让 G1 成为所有环境下 HotSpot JVM 的默认垃圾收集器(而不仅是服务器环境),取代了 Serial 收集器。
G1 垃圾收集器已得到改进(包括 JEP 522:G1 GC:在 Java 26 中通过减少同步来提升吞吐量),因此其性能现已足以取代 Serial。对于在受限环境中使用 Serial 表现更好的应用,可以通过 -XX:+UseSerialGC 选项显式启用它。
JEP 527:TLS 1.3 的后量子混合密钥交换
该 JEP 通过为 TLS 1.3 实现混合密钥交换算法,增强了需要安全网络通信的 Java 应用的安全性。这有助于防御“先收集,后解密”(harvest now, decrypt later)攻击,即攻击者今天记录加密流量,打算等量子计算机足够强大时再将其解密。
JEP 534:默认启用紧凑对象头
该 JEP 使紧凑对象头(compact object headers)成为 HotSpot JVM 中默认的对象头布局。
通过在 64 位架构上将对象头从 96 位减少到 64 位,紧凑对象头可减少堆大小、提升部署密度并改善数据局部性。
紧凑对象头在 Java 24 中作为实验性特性引入,并在 Java 25 中变为可选择启用。由于紧凑对象头如今已是默认设置,你不再需要像 JDK 25 那样通过命令行选项来启用它。
拥有大量对象的应用将受益于这一变化,因为使用紧凑对象头可减少 JVM 内存占用。JetBrains IDE 正在使用该特性,并观察到启用后内存占用持续下降。了解更多。
JEP 536:JFR 进程内数据脱敏
该 JEP 增强了 JDK Flight Recorder(JFR):在录制数据离开进程之前,对命令行参数以及环境变量和系统属性的初始值进行脱敏处理,从而避免敏感信息泄露。
Java 27 中的预览特性
预览特性让开发者有机会在特性成为正式特性之前进行试用并提供反馈。预览特性在最终定稿并成为语言标准组成部分之前,可能会经历多轮迭代,其间可能发生改变,也可能保持不变。
IntelliJ IDEA 致力于支持预览特性,让你可以在它们成为标准之前进行试验。由于这些特性随时可能发生变化,IntelliJ IDEA 仅支持当前 JDK 的预览特性。要启用预览特性,请将语言级别设为 27 (Preview) -- Primitive types in patterns, instanceof, and switch (5th preview)。
Java 27 包含四个预览特性和一个孵化器特性。这些特性本身与 Java 26 中相同,但其中一些在 Java 27 中经过了修订。
JEP 531:惰性常量(第三次预览)
惰性常量(lazy constants)是持有不可变数据的对象。顾名思义,它们是惰性求值的。相比即时求值的 final 字段,这带来了优势。使用惰性常量时,字段只在需要时才求值,从而可以改善启动时间。
如需稍微详细一些的解释,请参阅 Java 26 在 IntelliJ IDEA 中:惰性常量一节。
惰性常量首次在 Java 25 中引入(当时称为稳定值 stable values),并在 Java 26 中经历了重大变化。该 API 在 Java 27 中又进一步做了修订。
JEP 532:模式、instanceof 和 switch 中的基本类型(第五次预览)
正如 Java 26 在 IntelliJ IDEA 中的相关章节所述,该特性增强了模式匹配,使其在模式上下文中支持所有基本类型,包括 instanceof 和 switch。该特性移除了模式匹配的一些现有限制,使得在这些结构中匹配、测试并安全转换基本类型成为可能。它消除了对不安全的手动类型转换(可能引发难以察觉的 bug)和范围检查的需求,从而提升了代码的安全性和可读性。该特性在 Java 27 中仍处于预览阶段,与 Java 26 版本相比没有变化。
一个简单的例子
让我们看一个在 switch 表达式中使用基本类型并结合守卫模式(guard patterns)的简单示例。
我们可以为该方添加 Javadoc 来说明其工作方式。从 Java 23 开始(JEP 467),Javadoc 可以用 Markdown 编写。如果你的项目使用 JDK 23 或更高版本,当你使用上下文操作*添加 Javadoc(Add Javadoc)*时,IntelliJ IDEA 默认会插入 Markdown 文档注释。
添加 JavaDoc
附注:如果你更倾向于使用传统注释而非 Markdown,请打开设置(Settings),进入编辑器 | 代码样式 | Java | 代码生成 | 注释代码(Editor | Code Style | Java | Code Generation | Comment Code),并取消勾选*优先使用文档行注释(Prefer documentation line comments)*选项。
[LOADING...] 优先使用文档行注释
IntelliJ IDEA 可以使用上下文操作*转换为 Markdown 文档注释(Convert to Markdown documentation comment)*将现有 Javadoc 转换为 Markdown。
转换为 Markdown 文档注释
你可以在 Java 23 与 IntelliJ IDEA的这一节中找到关于该特性的更详细说明。
JEP 533:结构化并发(第七次预览)
正如 Java 26 在 IntelliJ IDEA 中的相关章节所述,结构化并发为多线程代码提供了更好的“惯用法”,这意味着代码更贴近用户的心智模型。
结构化并发把运行在不同线程中的相关任务组视为单个工作单元。这改善了可读性和可观测性,使并发代码更易于理解和推理。它还有助于消除线程泄漏和取消延迟。
关于结构化并发及其如何与 Project Loom 的其他特性协同工作的更多细节,请参阅我之前的博文IntelliJ IDEA 中的 Project Loom:虚拟线程、作用域值和结构化并发。
如那篇博文所述,有一个实时模板可以快速生成 StructuredTaskScope 的骨架。你可以使用快捷键(macOS 上为 ⌘J,Windows 和 Linux 上为 Ctrl+J)在 IntelliJ IDEA 中调出可用的实时模板列表。或者,你可以使用命令补全:输入 .. —— 随后会显示所有与当前上下文相关的命令。你甚至可以只输入命令名称的一部分(例如输入 “live” 表示 Show live templates),相关命令就会出现在常规补全列表中。
实时模板列表可按名称和描述进行搜索。如果我们搜索 “structured”,就会找到实时模板 sts。
使用命令补全显示实时模板
有关命令补全的更多信息,请参阅我之前的博文通用入口点:面向上下文感知编码辅助的单一入口。
JEP 538:密码学对象的 PEM 编码(第三次预览)
正如 Java 26 在 IntelliJ IDEA 中的相关章节所述,该 JEP 提供了一个预览 API,用于在密码学对象(密钥、证书和证书吊销列表)与隐私增强邮件(PEM)格式之间进行编码和解码。
与上一版本相比,该 API 在 Java 27 中经历了进一步的变化。
Java 27 中的孵化器特性
孵化器模块是实验性 API。它们明确是非最终的 API 和工具,供开发者试用。与预览特性不同,孵化器特性可能会发生重大变化,甚至在未来版本中被移除。它们不适用于生产环境。
要使用孵化器特性,你需要在运行代码时显式添加该模块,即为该特定模块添加 --add-modules 命令行选项。
如果你从 IntelliJ IDEA 运行代码,可以为应用的运行配置添加命令行选项。选择程序的运行配置,点击三个点打开更多操作(More Actions)。选择编辑(Edit)以打开运行/调试配置(Run/Debug Configurations)。点击修改选项(Modify Options)链接,在添加运行选项(Add Run Options)弹窗中选择添加 VM 选项(Add VM Options)。此时会出现一个带有 VM Options 提示的新字段。在该字段中添加命令行选项。
添加 VM 选项
JEP 537:Vector API(第十二次孵化)
正如 Java 26 在 IntelliJ IDEA 中的相关章节所述,该 JEP 引入了一个 API,让开发者能够表达向量计算,并在受支持的 CPU 上可靠地编译为最优的向量指令。向量操作使得单个 CPU 周期内可以完成更多工作,从而可能带来显著的性能提升。
由于这是一个孵化器模块,你需要像上面所述那样提供一个命令行选项来显式添加该模块。要使用 Vector API,请添加以下命令行选项:--add-modules jdk.incubator.vector。
与 Java 26 相比,Java 27 中的 Vector API 没有变化。在 Project Valhalla 所需特性以预览特性形式提供之前,该特性将继续处于孵化阶段。
其他变化:调试器改进
除了 JEP 之外,JDK 27 还包含缺陷修复,例如 JDK-6960970。此前调试器在单步执行时非常缓慢。这一问题已在 JDK 27 中修复,意味着如今在调试器中单步执行更快了。我们的工程师已将这一修复向后移植到 JetBrains Runtime(JBR)25,以便他们在调试 IntelliJ IDEA 自身代码时也能用上它。这表明将该改动向后移植到 Java 25 是可行的,并且该改动工作正常。如果你想利用这一改动,可以使用 JBR 25,或者请你的供应商将此改动向后移植。
展望未来
Project Valhalla 的特性已开始进入 Java。值对象(JEP 401)和 JVM 中的严格字段初始化(JEP 539)均已作为预览特性定位于 JDK 28。这意味着如果你想试用这些特性,不再需要下载特殊的 Valhalla 发行版。你可以下载 JDK 28 EA(早期访问)版本。该版本可以直接在 IntelliJ IDEA 内部下载。
如果你已经下载了 JDK 28 EA,也可以让 IntelliJ IDEA 指向你的安装位置。
结语
虽然 Java 27 不是 LTS 版本,但它带来了安全性和性能方面的改进,并继续演进若干重要的预览特性。IntelliJ IDEA 从第一天起就支持 Java 27,并将继续支持最新的 Java 特性。如果你有任何反馈,欢迎告诉我们。