Java 语言版本演进与特性概要
本文按时间线归纳 Java SE / JDK 各阶段代表性语言与平台特性,并标出常见 LTS(长期支持) 版本。细节以各版本 Release Notes 与 JEP(JDK Enhancement Proposal) 为准;预览(Preview)/ 孵化(Incubator) 特性在相邻版本中可能更名、调整或撤回。
发布节奏(2018 年起常见模式) :约 每六个月 发布一个特性版本;LTS 由 Oracle / OpenJDK 路线图书面约定(近年常见为 8、11、17、21 ,后续以 Oracle Java SE Support Roadmap 等官方页面为准),非 LTS 版本通常仅短期更新支持,生产选型以 LTS 为主。
目录
- [版本节奏与 LTS 一览](#版本节奏与 LTS 一览)
- [OpenJDK、JDK 与常见发行版](#OpenJDK、JDK 与常见发行版)
- 经典阶段(1.0~8)
- [现代阶段(9 起)](#现代阶段(9 起))
- 模块系统(JPMS)提要
- [JVM / GC 与平台特性(线索)](#JVM / GC 与平台特性(线索))
- [按 LTS 锚点的特性聚类](#按 LTS 锚点的特性聚类)
- 选型与升级建议
- 升级检查清单(工程向)
- 参考链接
版本节奏与 LTS 一览
半年节奏 + LTS
经典阶段
JDK 5
JDK 8 LTS
11 LTS
17 LTS
21 LTS
自 JDK 9 起,特性版 约每 6 个月 发布一次;LTS 在路线图中显式标定(17→21 等近年常见为约 两年 一档;8→11、11→17 间隔更长),各厂商据此提供延长支持与安全更新。非 LTS 特性版通常仅维护到下一版本发布后较短窗口,生产环境默认对齐 LTS。
三月特性版
九月特性版
次年三月...
其中少数版本被定为 LTS(见官方路线图)
| 版本 | 约发布时间 | 备注 |
|---|---|---|
| JDK 8 | 2014 | 广泛使用的 LTS,函数式与 java.time 等 |
| JDK 11 | 2018 | LTS,模块裁剪后基线、新 HTTP Client 等 |
| JDK 17 | 2021 | LTS,密封类、增强模式匹配等语言特性定型一批 |
| JDK 21 | 2023 | LTS,虚拟线程(Project Loom)等 |
| 维度 | 特性版(非 LTS) | LTS |
|---|---|---|
| 支持周期 | 短,适合尝鲜与 CI 多版本矩阵 | 长,适合线上与长期合同 |
| 升级频率 | 高 | 低;跨 LTS 迁移可规划 2~3 年窗口 |
| 厂商补丁 | 依赖发行版政策 | 多数商业/社区发行版提供多年安全修复 |
JDK 25 等后续 LTS 编号与月份以 Oracle Support Roadmap / OpenJDK 公告为准,上表不预见具体未发布能力。
OpenJDK、JDK 与常见发行版
Java SE 平台规范 由 JCP 维护;OpenJDK 是参考实现的主干源码社区。**「JDK」**在工程语境下常指「某家打包好的可运行 Java 开发/运行套件」,与「是否收费/支持条款」无关------需看具体发行版。
| 类型 | 说明 |
|---|---|
| OpenJDK 构建 | 基于 OpenJDK 源码树,由不同组织构建与签名(如 Eclipse Temurin 、Amazon Corretto 、Microsoft Build of OpenJDK 等) |
| Oracle JDK | Oracle 分发与支持策略以官网为准;与 OpenJDK 同源演进但许可/组件可能不同 |
| GraalVM / Native Image | 侧重 AOT、多语言;版本号仍跟踪某 JDK 基线,迁移时需单独对照 |
选型时除 语言特性 外,还应核对:TLS/加密组件策略 、长期安全更新 、容器镜像来源 与 许可证。
经典阶段(1.0~8)
JDK 1.0~1.4:基础平台
| 版本 | 代表性内容(节选) |
|---|---|
| 1.0(1996) | 首个正式平台,虚拟机 + 基础类库 |
| 1.1(1997) | 内部类、JavaBeans、RMI、反射、JDBC |
| 1.2 / Java 2(1998) | 集合框架、Swing、HotSpot 相关演进 |
| 1.3(2000) | HotSpot 成为默认 VM(常见发行版叙事) |
| 1.4(2002) | java.util.regex 、NIO(Buffer/Channel)、IPv6、日志 API 等 |
JDK 5(2004):语言现代化第一站
| 特性 | 说明 |
|---|---|
| 泛型 | 参数化类型,编译期擦除实现 |
| 注解 | 元数据,影响框架与工具链 |
| 自动装箱/拆箱 | 基本类型与包装类转换 |
| 枚举 | 类型安全枚举 |
| 增强 for、varargs | 语法糖 |
| java.util.concurrent | 并发集合与执行器框架 |
JDK 6(2006)
平台成熟与性能调优为主(如编译器、监控、脚本引擎 javax.script 等);Oracle 收购 Sun 后商业支持策略变化,对 JDK 分发有影响(与语言特性正交)。
JDK 7(2011)
| 类别 | 内容 |
|---|---|
| 语言 | switch 字符串 、try-with-resources 、菱形 <>、二进制/下划线数字字面量等 |
| 库 | NIO.2 (java.nio.file)、ForkJoinPool |
JDK 8(2014,LTS)
| 类别 | 内容 |
|---|---|
| 语言 | Lambda 、方法引用 、接口 default/static 方法 |
| 库 | Stream API 、java.time 、Optional |
| JVM | PermGen 移除 ,类元数据等主要由 Metaspace 管理(具体行为随 GC/实现而变) |
现代阶段(9 起)
发布模型
- JDK 9 :模块系统(JPMS )、jlink 、G1 默认 GC 等;版本号改为时间驱动前的关键一站。
- JDK 10~ :通常每版带若干语言/JVM/库 JEP;非 LTS 仅适合试用与短期验证。
按版本简表(9~24,节选)
| 版本 | 类型(常见划分) | 代表性方向(节选) |
|---|---|---|
| 9 | 特性版 | 模块系统 、JShell、集合工厂方法、G1 默认 |
| 10 | 非 LTS | var 局部变量类型推断 |
| 11 | LTS | HTTP Client (标准)、单文件源码运行 、字符串辅助方法;移除 Java EE / CORBA 等模块(后续 EE 走 Jakarta EE) |
| 12~14 | 非 LTS | Switch 表达式 、文本块 、Record 、instanceof 模式匹配等多为预览迭代 |
| 15 | 非 LTS | 文本块、Record 等转正;密封类预览 |
| 16 | 非 LTS | instanceof 模式匹配等;Vector API(孵化) 等 |
| 17 | LTS | 密封类 转正;强封装 JDK 内部 API ;FFM 前身(孵化) 等 |
| 18 | 非 LTS | 默认字符集 UTF-8 、简易 jwebserver 等 |
| 19~20 | 非 LTS | 虚拟线程 、结构化并发 等预览/孵化迭代 |
| 21 | LTS | 虚拟线程 等进入正式特性;记录模式 、Scoped Values 等仍多处于预览/演进 |
| 22~24 | 非 LTS | 多文件源码运行、语言小步调整、Vector API / Gatherers 等持续演进;SecurityManager 弃用移除按 JEP 分阶段 |
上表中「转正」指在该版本以正式语言或平台特性发布;具体 JEP 编号与变更请以 JDK 发布说明 为准。
模块系统(JPMS)提要
JDK 9 引入 Java Platform Module System ,核心文件为模块路径上的 module-info.java。
| 概念 | 说明 |
|---|---|
| module | 命名单元,显式 requires / exports / opens |
| classpath vs modulepath | 模块化后大量库仍可在 classpath;混用时需注意拆包与可读性 |
| 强封装 | JDK 16+ 起默认强封装 JDK 内部包 (如 sun.misc),迁移时常需改依赖或通过 --add-opens 等临时手段(应逐步消除) |
| jlink | 可按模块裁剪 自定义运行时镜像(服务端/容器场景) |
从 JDK 8 → 11 的多数「踩坑」来自:非法反射访问 、被移除的 EE 模块 、工具链与容器基线 未同步。
JDK 8
classpath 世界
JDK 9+
module-info / 模块路径
JDK 16+
内部 API 强封装
JVM / GC 与平台特性(线索)
语言版本与 JVM 行为 并行演进;以下为查阅 JEP 时的常见索引(非完整列表)。
| 方向 | 与版本相关的线索(需查对应 JEP) |
|---|---|
| GC | G1 默认与调参演进;ZGC 、Shenandoah 等低延迟路线;分代 ZGC 等 |
| 性能 | CDS/AppCDS 类数据共享、启动优化;JIT / AOT(部分路线已调整或移除,以发布说明为准) |
| 观测 | JFR 默认可用范围、jcmd 子命令扩展 |
| 向量/Native | Vector API(孵化→演进) 、Foreign Function & Memory(FFM) 替代 JNI 的方向 |
生产变更应同时阅读 Release Notes 中的 JDK 行为变更 与 JDK 18+ UTF-8 默认 等平台级条目。
按 LTS 锚点的特性聚类
便于对照「从上一 LTS 升到下一 LTS」大致会跨过哪些能力:
| 升级路径 | 可重点关注的能力方向 |
|---|---|
| 8 → 11 | 模块可见性、var、新 HTTP 客户端、字符串/API 清理、GC 与容器感知等运维向变化 |
| 11 → 17 | Record、文本块、密封类、模式匹配雏形、FFM 路线、内部 API 强封装与依赖迁移 |
| 17 → 21 | 虚拟线程与并发编程模型、GC/JVM 持续改进、语言模式匹配与集合工厂等继续完善 |
选型与升级建议
| 场景 | 建议 |
|---|---|
| 新建长期维护服务 | 优先当前 最新 LTS (编写时常见为 21),并以官方路线图确认下一 LTS。 |
| 试用语言/JVM 前沿 | 可选用当前非 LTS,但需接受短支持周期与行为微调。 |
| 滞留 JDK 8 | 至少评估 11 的安全与协议支持;若条件允许,直接对齐 17 或 21 可减少多次迁移成本。 |
| 库与框架 | 升级前核对 Spring / Jakarta / 字节码库等对字节码版本与模块的要求。 |
升级检查清单(工程向)
| 步骤 | 检查项 |
|---|---|
| 1 | 目标 LTS 与 OpenJDK 发行版(镜像、支持年限、许可证) |
| 2 | 字节码级别 :构建 source/target 或 --release 与运行 JDK 的关系 |
| 3 | 依赖jar:是否访问 JDK 内部 API;是否需替换为受支持 API |
| 4 | 反射 / 注入框架 :是否需 --add-opens;能否通过升级框架版本消除 |
| 5 | ** Jakarta EE** 命名空间与 Spring Boot 主版本矩阵 |
| 6 | CI:并行保留旧 LTS 跑回归,直至全量切换 |
| 7 | 观测:JFR、GC 日志、HeapDump 在新 GC 下的行为差异 |
参考链接
- OpenJDK 各版本发布公告:https://openjdk.org/projects/jdk/
- Oracle Java SE 支持路线图:https://www.oracle.com/java/technologies/java-se-support-roadmap.html
- JEP 索引:https://openjdk.org/jeps/0
本文仅作纲要式 梳理,实施升级请以目标 JDK 的 Migration Guide 与依赖项兼容性矩阵为准。