JDK 25:生产基线换代:作用域、紧凑源文件与对象头
JDK 25 是 2025-09-16 发布的 LTS。它把 21 时代的几条预览线收束为正式能力:Scoped Values、紧凑源文件与实例 main、模块导入、灵活构造器体。同时,结构化并发仍在第五次预览,紧凑对象头转正但默认关闭——版本边界比新语法更值得先记。
这一课,你必须能自己回答GOALS
合上资料后,逐条自述
- ScopedValue 与 ThreadLocal 的成本差异在哪里?为什么它适合虚拟线程?绑定何时失效?
- 结构化并发在 JDK 25 是什么状态?新的 open/Joiner API 与 21 的 ShutdownOnFailure 有何不同?
- 紧凑源文件允许什么、禁止什么?
java Hello.java与javac的行为差别在哪? import module java.base;到底导入了什么?为什么它不能替代模块系统?- 灵活构造器体允许在 super()/this() 之前写什么?字段初始化的限制是什么?
- 紧凑对象头把对象头压到多少位?为什么 25 上默认没有开启?启用条件是什么?
- 从 21 升到 25,哪些 API 与启动参数需要先处理?32 位 x86 移除影响谁?
- JDK 25 还有哪些预览特性?预览 class 为什么不能跨版本运行?
三种模式,各解决一个问题MODES
学习路径TRACKS
面试突击 · 2 小时
先结论后机制先用 15 道题暴露盲区,再回到速查补齐 API 与版本边界。重点记「哪些转正、哪些仍预览、哪些默认没变」。
语言与启动 · 1 天
从单文件到构造器按「紧凑源文件 → 模块导入 → 灵活构造器体」顺序走一遍。每节都先看编译器允许什么、拒绝什么,再谈写法。
并发与运行时 · 2 天
机制 + 边界从 ScopedValue 的绑定快照讲到结构化并发的取消树,再下潜到对象头布局。重点不是 API,而是「什么状态下谁负责清理」。
换一个版本,继续同一门课SWITCH
所有完整课程共用「速查 → 深钻 → 面试」结构。切换版本后,再从顶栏版本菜单切一次,就会落在目标版本的同一模块。
全部学习单元9
速查模块 · 6 个主题
Scoped Values:作用域内的不可变上下文
ScopedValue 把上下文从「每个线程一份可变副本」变成「一段执行路径上的只读绑定」:进入作用域时安装,退出时恢复,子任务只在结构化 fork 时继承。JDK 25 转正,API 与 21 预览版有差异。
Structured Concurrency:第五次预览的新 API
JDK 25 的结构化并发仍是预览,但 API 已换成 open() + Joiner:作用域是接口,子任务默认跑在虚拟线程上,失败或超时会取消兄弟任务。21 的 ShutdownOnFailure / ShutdownOnSuccess 在 25 已不存在。
Compact Source Files:没有 class 外壳的程序
JDK 25 正式允许单文件程序省略 package 与 class 声明,直接写 import、字段、方法和实例 main。java Hello.java 即可运行;它降低的是入门与小工具的门槛,不是替代正规类结构。
Module Import Declarations:一行导入一个模块
import module java.base; 把 java.base 导出的所有包一次性导入,等价于几十条按需包导入。它解决的是 import 噪音,不是模块化:不改变 requires,不打开封装,也不能导入 classpath 上的未命名模块。
Flexible Constructor Bodies:把校验放到 super() 之前
JDK 25 正式允许在 super(...) / this(...) 之前写语句:可以先校验参数、计算参数、初始化本类字段,再调用父构造器。代价是这些语句处于「早期构造上下文」,不能读取正在构造的对象。
从 21 迁移到 25
21 → 25 的升级难点不在语法,而在「预览转正」与「默认值没变」:Scoped Values 与模块导入去掉预览参数,结构化并发换了 API 却仍是预览,紧凑对象头与分代 Shenandoah 转正但默认关闭,32 位 x86 端口被移除。
深钻模块 · 3 个主题
Scoped Values 内部:绑定快照、作用域与传递边界
ScopedValue 把上下文从「每个线程一份可变副本」改成「一段执行路径上的只读绑定」:进入作用域安装,退出恢复,结构化 fork 时复制快照引用。理解这条链,才能判断什么时候它能替代 ThreadLocal,什么时候不能。
结构化并发:把子任务关进词法作用域
结构化并发不是更快的线程池,而是把一组子任务的生命周期、失败与取消收束到一个词法块里。JDK 25 仍是第五次预览,API 已换成 open() + Joiner,21 的 ShutdownOnFailure 不能直接编译。
紧凑对象头:从 96/128 位到 64 位
紧凑对象头把 64 位 HotSpot 的对象头从 96/128 位压到 64 位。JEP 519 在 JDK 25 把它从实验特性转为产品特性,但明确不改变默认布局:默认仍是旧布局,需要显式 -XX:+UseCompactObjectHeaders。
版本上下文JDK 25
JDK 25 于 2025-09-16 发布,class 文件版本 69。它是 21 之后的 LTS,也是未来几年新的生产基线:Scoped Values 正式(JEP 506),紧凑源文件(JEP 512)、模块导入(JEP 511)、灵活构造器体(JEP 513)正式,紧凑对象头(JEP 519)与分代 Shenandoah(JEP 521)转为产品特性。结构化并发仍是预览(JEP 505,第五次预览),且 API 在 25 发生了不兼容调整。
--release 25 --enable-preview 编译并 --enable-preview 运行。紧凑对象头虽已转正,但 JEP 519 明确不改变默认布局:25 上仍需 -XX:+UseCompactObjectHeaders。分代 Shenandoah 同样转正,但默认仍是 satb 模式。