JDK 27 已进入 RC:从九项 JEP 看 Java 28 的演进方向

2026-08-24 46 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

JDK 27 已进入首个 Release Candidate 阶段,意味着本次发布的功能集合基本冻结。作为 JDK 25 之后的第二个非 LTS 版本,它最终包含 9 项 JEP,覆盖核心类库、HotSpot、安全类库和 Java 语言规范四个方向。对生产团队来说,JDK 27 更适合被视为一次验证窗口:确认升级链路、观察运行时行为,并为下一次 LTS 之外的 Java 演进积累数据。

RC 阶段意味着什么

进入 RC 并不等于所有风险自动消失,但它通常代表新特性的范围已经稳定。此时社区和企业更值得关注的,不是继续猜测会不会再塞进一项大功能,而是验证以下问题:

  • 现有构建工具能否识别目标 JDK;
  • 单元测试、集成测试和性能测试是否存在版本相关回归;
  • 依赖的字节码工具、Agent、框架和原生库是否兼容;
  • 安全策略、TLS 配置、证书处理和加密提供者是否出现行为变化;
  • CI 镜像、容器基础镜像及生产诊断工具是否已经覆盖新版本。

非 LTS 版本的价值不只在于“尝鲜”。它让团队能在下一次长期支持版本到来前,提前发现自己对 JDK 内部行为、过期 API 或旧版工具链的隐性依赖。

九项 JEP 分布在四条主线

从 JDK 27 的分类可以看出,Java 平台的演进仍然同时发生在语言、标准库、虚拟机和安全边界上。

核心 Java 类库

核心类库的变化往往最容易进入业务代码,因为它直接影响集合、I/O、并发、网络、日期时间或常见 API 的使用方式。团队升级时不能只编译一次就结束,还应关注行为兼容性,例如边界输入、字符编码、资源释放和异常类型是否保持预期。

HotSpot

HotSpot 相关 JEP 更接近运行时:即时编译、垃圾回收、内存管理、启动速度、诊断能力或平台支持都可能在这一层发生变化。它们未必要求业务代码修改,却可能改变延迟曲线、吞吐量、CPU 使用率和容器内存表现。

对高负载服务而言,升级验证应包含预热后的压测,而不只是冷启动测试。JIT 编译和垃圾回收的差异,通常会在持续运行一段时间后才真正显现。

安全类库

安全相关演进的影响范围经常被低估。证书链、默认算法、TLS 协商、密钥库格式和安全提供者的变化,可能只在某个合作方接口、某台旧设备或某个历史证书上暴露问题。

因此,涉及 HTTPS、mTLS、签名验签或私有 CA 的系统,应在升级前准备真实或脱敏后的证书样本进行回归,而不是仅依赖普通 HTTP 健康检查。

Java 语言规范

语言规范层面的调整不一定都表现为一个醒目的新关键字。它也可能澄清编译规则、类型推导、语义边界或兼容性要求。对于大量使用注解处理器、代码生成、静态分析和复杂泛型的项目,这类变化尤其值得通过完整构建来确认。

可以这样实践:把 JDK 27 作为兼容性验证目标

在 JDK 27 RC 阶段,可以先不修改业务逻辑,而是建立一个与当前 LTS 并行的验证任务。下面的示例假设项目当前以 Java 25 为编译基线,JDK 27 只用于编译和运行测试。

创建一个最小程序 src/main/java/com/example/App.java

package com.example;

import java.time.Instant;

public class App {
    public static void main(String[] args) {
        System.out.println("Running on: " + Runtime.version());
        System.out.println("Timestamp: " + Instant.now());
    }
}

使用 JDK 27 的 javac,但仍按 Java 25 的公开 API 基线编译:

mkdir -p out
javac --release 25 -d out src/main/java/com/example/App.java
java -cp out com.example.App

这条命令的意义在于区分两个问题:代码是否只能依赖 Java 25 API,以及它能否在 JDK 27 运行时正常执行。输出中的 Runtime.version() 应显示实际运行的 JDK 版本。

在 CI 中,可以进一步将两个 JDK 矩阵并行运行。以下是一个可改造的 GitHub Actions 示例,假设项目使用 Maven:

name: jdk-compatibility

on:
  push:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        java: ["25", "27"]
    steps:
      - uses: actions/checkout@v4
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: ${{ matrix.java }}
      - name: Run tests
        run: ./mvnw -B test

实际接入时,需要把 distribution 和 JDK 版本替换为团队已经批准的发行版与可用构建。对于 RC 版本,也应明确它是验证环境而非默认生产基线,除非组织已有相应的发布和支持策略。

验证不应只看“测试绿了”

一次可信的 JDK 27 评估,至少应覆盖三个层次。

  1. 构建兼容性:执行完整编译、注解处理、代码生成、静态检查和打包流程。
  2. 运行兼容性:运行单元测试、集成测试、关键接口回归,以及带真实 TLS 或证书材料的安全测试。
  3. 运行时指标:比较启动耗时、P95/P99 延迟、吞吐量、堆内存、GC 暂停和 CPU 使用率。

对于依赖 Java Agent、字节码增强或 JNI 的系统,还要单独验证 APM、Mock 框架、覆盖率工具和本地库。JDK 升级失败常常不在业务模块,而在这些靠近运行时的基础设施组件。

JDK 28 可以期待什么

目前能确定的是,JDK 27 的功能范围已经形成稳定集合;至于 JDK 28 会接纳哪些 JEP,仍应以正式的 JEP 目标状态为准。可以合理预期的是,Java 会继续沿着核心 API、HotSpot、平台安全和语言规范这几条并行轨道推进。

但团队不应把路线图预测当成排期依据。更稳妥的做法是:持续关注候选 JEP 的状态,把实验性能力隔离在小范围验证分支中,并保留从非 LTS 版本回退到当前 LTS 的能力。

采用建议

JDK 27 RC 适合现在就进入 CI 和预发布环境,用来暴露兼容性与性能问题;是否投入生产,则取决于组织对非 LTS 版本的支持策略、第三方依赖成熟度和问题响应能力。

可以用下面这份清单决定是否推进:

  • 构建、测试和发布流水线已在 JDK 27 上跑通;
  • 关键依赖、Java Agent 和原生库已完成兼容性确认;
  • HTTPS、mTLS、证书和加密相关场景已回归;
  • 压测结果没有不可接受的延迟、吞吐或内存退化;
  • 已定义回滚方案,并保留当前 LTS 的可部署制品。

把 JDK 27 当作一次有边界的工程验证,而不是一次全量押注,能让团队在 JDK 28 及后续版本到来时拥有更可靠的升级节奏。


相关推荐