---
title: Java 25 新特性概览
description: 概览 JDK 25 的关键新特性与预览改动,关注并发、GC 与语言/平台增强。
category: Java
tag:
- Java新特性
head:
- - meta
- name: keywords
content: Java 25,JDK25,LTS,作用域值,紧凑对象头,分代 Shenandoah,模块导入,结构化并发
---
JDK 25 于 2025 年 9 月 16 日 发布,这是一个非常重要的版本,里程碑式。
JDK 25 是 LTS(长期支持版),至此为止,目前有 JDK8、JDK11、JDK17、JDK21 和 JDK 25 这五个长期支持版了。
JDK 25 共有 18 个新特性,这篇文章会挑选其中较为重要的一些新特性进行详细介绍:
- [JEP 506: Scoped Values (作用域值)](https://openjdk.org/jeps/506)
- [JEP 512: Compact Source Files and Instance Main Methods (紧凑源文件与实例主方法)](https://openjdk.org/jeps/512)
- [JEP 519: Compact Object Headers (紧凑对象头)](https://openjdk.org/jeps/519)
- [JEP 521: Generational Shenandoah (分代 Shenandoah GC)](https://openjdk.org/jeps/521)
- [JEP 507: Primitive Types in Patterns, instanceof, and switch (模式匹配支持基本类型, 第三次预览)](https://openjdk.org/jeps/507)
- [JEP 505: Structured Concurrency (结构化并发, 第五次预览)](https://openjdk.org/jeps/505)
- [JEP 511: Module Import Declarations (模块导入声明)](https://openjdk.org/jeps/511)
- [JEP 513: Flexible Constructor Bodies (灵活的构造函数体)](https://openjdk.org/jeps/513)
- [JEP 508: Vector API (向量 API, 第十次孵化)](https://openjdk.org/jeps/508)
下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

## JEP 506: 作用域值
作用域值(Scoped Values)可以在线程内和线程间共享不可变的数据,优于线程局部变量 `ThreadLocal` ,尤其是在使用大量虚拟线程时。
```java
final static ScopedValue<...> V = new ScopedValue<>();
// In some method
ScopedValue.where(V, )
.run(() -> { ... V.get() ... call methods ... });
// In a method called directly or indirectly from the lambda expression
... V.get() ...
```
作用域值通过其“写入时复制”(copy-on-write)的特性,保证了数据在线程间的隔离与安全,同时性能极高,占用内存也极低。这个特性将成为未来 Java 并发编程的标准实践。
## JEP 512: 紧凑源文件与实例主方法
该特性第一次预览是由 [JEP 445](https://openjdk.org/jeps/445 "JEP 445") (JDK 21 )提出,随后经过了 JDK 22 、JDK 23 和 JDK 24 的改进和完善,最终在 JDK 25 顺利转正。
这个改进极大地简化了编写简单 Java 程序的步骤,允许将类和主方法写在同一个没有顶级 `public class`的文件中,并允许 `main` 方法成为一个非静态的实例方法。
```java
class HelloWorld {
void main() {
System.out.println("Hello, World!");
}
}
```
进一步简化:
```java
void main() {
System.out.println("Hello, World!");
}
```
这是为了降低 Java 的学习门槛和提升编写小型程序、脚本的效率而迈出的一大步。初学者不再需要理解 `public static void main(String[] args)` 这一长串复杂的声明。对于快速原型验证和脚本编写,这也使得 Java 成为一个更有吸引力的选择。
## JEP 519: 紧凑对象头
该特性第一次预览是由 [JEP 450](https://openjdk.org/jeps/450 "JEP 450") (JDK 24 )提出,JDK 25 就顺利转正了。
通过优化对象头的内部结构,在 64 位架构的 HotSpot 虚拟机中,将对象头大小从原本的 96-128 位(12-16 字节)缩减至 64 位(8 字节),最终实现减少堆内存占用、提升部署密度、增强数据局部性的效果。
紧凑对象头并没有成为 JVM 默认的对象头布局方式,需通过显式配置启用:
- JDK 24 需通过命令行参数组合启用:
`$ java -XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders ...` ;
- JDK 25 之后仅需 `-XX:+UseCompactObjectHeaders` 即可启用。
## JEP 521: 分代 Shenandoah GC
Shenandoah GC 在 JDK12 中成为正式可生产使用的 GC,默认关闭,通过 `-XX:+UseShenandoahGC` 启用。
Redhat 主导开发的 Pauseless GC 实现,主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等
传统的 Shenandoah 对整个堆进行并发标记和整理,虽然暂停时间极短,但在处理年轻代对象时效率不如分代 GC。引入分代后,Shenandoah 可以更频繁、更高效地回收年轻代中的大量“朝生夕死”的对象,使其在保持极低暂停时间的同时,拥有了更高的吞吐量和更低的 CPU 开销。
Shenandoah GC 需要通过命令启用:
- JDK 24 需通过命令行参数组合启用:`-XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCMode=generational`
- JDK 25 之后仅需 `-XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational` 即可启用。
## JEP 507: 模式匹配支持基本类型 (第三次预览)
该特性第一次预览是由 [JEP 455](https://openjdk.org/jeps/455 "JEP 455") (JDK 23 )提出。
模式匹配可以在 `switch` 和 `instanceof` 语句中处理所有的基本数据类型(`int`, `double`, `boolean` 等)
```java
static void test(Object obj) {
if (obj instanceof int i) {
System.out.println("这是一个int类型: " + i);
}
}
```
这样就可以像处理对象类型一样,对基本类型进行更安全、更简洁的类型匹配和转换,进一步消除了 Java 中的模板代码。
## JEP 505: 结构化并发(第五次预览)
JDK 19 引入了结构化并发,一种多线程编程方法,目的是为了通过结构化并发 API 来简化多线程编程,并不是为了取代`java.util.concurrent`,目前处于孵化器阶段。
结构化并发将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性并增强可观察性。也就是说,结构化并发保留了单线程代码的可读性、可维护性和可观察性。
结构化并发的基本 API 是`StructuredTaskScope`,它支持将任务拆分为多个并发子任务,在它们自己的线程中执行,并且子任务必须在主任务继续之前完成。
`StructuredTaskScope` 的基本用法如下:
```java
try (var scope = new StructuredTaskScope