---
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 被 Oracle ç大夿° JDK åè¡æ¹å为 LTSï¼é¿ææ¯æçï¼ãOracle å½åç LTS çæ¬å
æ¬ JDK 8ãJDK 11ãJDK 17ãJDK 21 å 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 æ¯ä¸ªçæ¬çæ´æ°å¸¦æ¥çæ°ç¹æ§æ°éåæ´æ°æ¶é´ï¼

## JDK 25
### JEP 506: ä½ç¨åå¼
ä½ç¨åå¼ï¼Scoped Valuesï¼å¯ä»¥å¨çº¿ç¨å
å线ç¨é´å
±äº«ä¸å¯åçæ°æ®ï¼ä¼äºçº¿ç¨å±é¨åé `ThreadLocal`ï¼å°¤å
¶æ¯å¨ä½¿ç¨å¤§éèæçº¿ç¨æ¶ã
```java
final static ScopedValue<...> V = ScopedValue.newInstance();
// In some method
ScopedValue.where(V, )
.run(() -> { ... V.get() ... call methods ... });
// In a method called directly or indirectly from the lambda expression
... V.get() ...
```
ä½ç¨å弿ä¾ä»è°ç¨è
å°è¢«è°ç¨è
çååä¸å¯åæ°æ®ä¼ éãéè¿ç»æåå¹¶åå建çå线ç¨å¯ä»¥ç»§æ¿ç¶çº¿ç¨ä¸çç»å®ï¼èä¸è¿ç§ç»§æ¿æ éå¤å¶ç»å®ï¼ä»èåå°å¤§é线ç¨å
±äº«ä¸ä¸ææ¶çæ¶é´å空é´å¼éã
### 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 å¨ JDK 12 ä¸ä½ä¸ºå®éªç¹æ§å¼å
¥ï¼å¹¶å¨ JDK 15 ä¸è½¬ä¸ºæ£å¼äº§åç¹æ§ãå®é»è®¤å
³éï¼å¯éè¿ `-XX:+UseShenandoahGC` å¯ç¨ã
Shenandoah æ¯ç± Red Hat 主导å¼åç使åå徿¶éå¨ï¼ç®æ æ¯å¨å è¾å¤§æ¶ä»å°½éä¿æè¾çä¸ä¸å 大å°ç¸å¯¹ç¬ç«çæåæ¶é´ã
ä¼ ç»ç 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 çå½¢å¼å¼å
¥äºç»æåå¹¶åãJDK 25 ä¸è¯¥ API å¤äºç¬¬äºæ¬¡é¢è§é¶æ®µï¼ç®çæ¯ç®åå¤çº¿ç¨ç¼ç¨ï¼å¹¶ä¸æ¯ä¸ºäºå代 `java.util.concurrent`ã
ç»æåå¹¶åå°ä¸å线ç¨ä¸è¿è¡çå¤ä¸ªä»»å¡è§ä¸ºå个工ä½åå
ï¼ä»èç®åé误å¤çãæé«å¯é æ§å¹¶å¢å¼ºå¯è§å¯æ§ãä¹å°±æ¯è¯´ï¼ç»æåå¹¶åä¿çäºå线ç¨ä»£ç çå¯è¯»æ§ãå¯ç»´æ¤æ§åå¯è§å¯æ§ã
ç»æåå¹¶åçåºæ¬ API æ¯ `StructuredTaskScope`ï¼å®æ¯æå°ä»»å¡æå为å¤ä¸ªå¹¶ååä»»å¡ï¼å¨å®ä»¬èªå·±ç线ç¨ä¸æ§è¡ï¼å¹¶ä¸åä»»å¡å¿
é¡»å¨ä¸»ä»»å¡ç»§ç»ä¹å宿ã
`StructuredTaskScope` çåºæ¬ç¨æ³å¦ä¸ï¼
```java
try (var scope = StructuredTaskScope.open()) {
// 使ç¨forkæ¹æ³æ´¾ççº¿ç¨æ¥æ§è¡åä»»å¡
Subtask subtask1 = scope.fork(task1);
Subtask subtask2 = scope.fork(task2);
// çå¾
线ç¨å®æ
scope.join();
// ç»æçå¤çå¯è½å
æ¬å¤çæéæ°æåºå¼å¸¸
... process results/exceptions ...
} // close
```
ç»æåå¹¶åé常éåèæçº¿ç¨ï¼èæçº¿ç¨æ¯ JDK å®ç°çè½»é级线ç¨ã许å¤èæçº¿ç¨å
±äº«åä¸ä¸ªæä½ç³»ç»çº¿ç¨ï¼ä»èå
许é常å¤çèæçº¿ç¨ã
### JEP 511: 模å导å
¥å£°æ
è¯¥ç¹æ§ç¬¬ä¸æ¬¡é¢è§æ¯ç± [JEP 476](https://openjdk.org/jeps/476 "JEP 476")ï¼JDK 23ï¼æåºï¼éåå¨ [JEP 494](https://openjdk.org/jeps/494 "JEP 494")ï¼JDK 24ï¼ä¸è¿è¡äºå®åï¼JDK 25 顺å©è½¬æ£ã
模å导å
¥å£°æå
è®¸å¨ Java 代ç ä¸ç®æ´å°å¯¼å
¥æ´ä¸ªæ¨¡åçææå¯¼åºå
ï¼èæ éé个声æå
ç导å
¥ãè¿ä¸ç¹æ§ç®åäºæ¨¡åååºçéç¨ï¼ç¹å«æ¯å¨ä½¿ç¨å¤ä¸ªæ¨¡åæ¶ï¼é¿å
äºå¤§éçå
导å
¥å£°æï¼ä½¿å¾å¼åè
å¯ä»¥æ´æ¹ä¾¿å°è®¿é®ç¬¬ä¸æ¹åºå Java åºæ¬ç±»ã
æ¤ç¹æ§å¯¹åå¦è
åååå¼å尤为æç¨ï¼å ä¸ºå®æ éå¼åè
å°èªå·±çä»£ç æ¨¡ååï¼åæ¶ä¿çäºå¯¹ä¼ ç»å¯¼å
¥æ¹å¼çå
¼å®¹æ§ï¼æåäºå¼åæçå代ç å¯è¯»æ§ã
```java
// 导å
¥æ´ä¸ª java.base 模åï¼å¼åè
å¯ä»¥ç´æ¥è®¿é® ListãMapãStream çç±»ï¼èæ éæ¯æ¬¡æå¨å¯¼å
¥ç¸å
³å
import module java.base;
public class Example {
public static void main(String[] args) {
String[] fruits = { "apple", "berry", "citrus" };
Map fruitMap = Stream.of(fruits)
.collect(Collectors.toMap(
s -> s.toUpperCase().substring(0, 1),
Function.identity()));
System.out.println(fruitMap);
}
}
```
### JEP 513: çµæ´»çæé 彿°ä½
è¯¥ç¹æ§ç¬¬ä¸æ¬¡é¢è§æ¯ç± [JEP 447](https://openjdk.org/jeps/447 "JEP 447")ï¼JDK 22ï¼æåºï¼éåå¨ [JEP 482 ](https://openjdk.org/jeps/482 "JEP 482 ")ï¼JDK 23ï¼å [JEP 492](https://openjdk.org/jeps/492 "JEP 492")ï¼JDK 24ï¼ç»åäºé¢è§ï¼JDK 25 顺å©è½¬æ£ã
Java è¦æ±å¨æé 彿°ä¸ï¼`super(...)` æ `this(...)` è°ç¨å¿
é¡»ä½ä¸ºç¬¬ä¸æ¡è¯å¥åºç°ãè¿æå³çæä»¬æ æ³å¨è°ç¨ç¶ç±»æé 彿°ä¹åå¨åç±»æé 彿°ä¸ç´æ¥åå§ååæ®µã
çµæ´»çæé 彿°ä½è§£å³äºè¿ä¸é®é¢ï¼å®å
è®¸å¨æé 彿°ä½å
ï¼å¨è°ç¨ `super(..)` æ `this(..)` ä¹åç¼åè¯å¥ï¼è¿äºè¯å¥å¯ä»¥åå§ååæ®µï¼ä½ä¸è½å¼ç¨æ£å¨æé çå®ä¾ãè¿æ ·å¯ä»¥é²æ¢å¨ç¶ç±»æé 彿°ä¸è°ç¨åç±»æ¹æ³æ¶ï¼åç±»çåæ®µæªè¢«æ£ç¡®åå§åï¼å¢å¼ºäºç±»æé çå¯é æ§ã
è¿ä¸ç¹æ§è§£å³äºä¹å Java è¯æ³éå¶äºæé 彿°ä»£ç ç»ç»çé®é¢ï¼è®©å¼åè
è½å¤æ´èªç±ãæ´èªç¶å°è¡¨è¾¾æé 彿°çè¡ä¸ºï¼ä¾å¦å¨æé 彿°ä¸ç´æ¥è¿è¡åæ°éªè¯ãåå¤åå
±äº«ï¼èæ éä¾èµè¾
婿¹æ³ææé 彿°ï¼æé«äºä»£ç çå¯è¯»æ§åå¯ç»´æ¤æ§ã
```java
class Person {
private final String name;
private int age;
public Person(String name, int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative.");
}
this.name = name; // å¨è°ç¨ç¶ç±»æé 彿°ä¹ååå§ååæ®µ
this.age = age;
// ... å
¶ä»åå§å代ç
}
}
class Employee extends Person {
private final int employeeId;
public Employee(String name, int age, int employeeId) {
this.employeeId = employeeId; // å¨è°ç¨ç¶ç±»æé 彿°ä¹ååå§ååæ®µ
super(name, age); // è°ç¨ç¶ç±»æé 彿°
// ... å
¶ä»åå§å代ç
}
}
```
### JEP 508: åé APIï¼ç¬¬å次åµåï¼
åé计ç®ç±å¯¹åéçä¸ç³»åæä½ç»æãåé API ç¨æ¥è¡¨è¾¾åé计ç®ï¼è¯¥è®¡ç®å¯ä»¥å¨è¿è¡æ¶å¯é å°ç¼è¯ä¸ºæ¯æç CPU æ¶æä¸çæä½³åéæä»¤ï¼ä»èå®ç°ä¼äºçææ é计ç®çæ§è½ã
åé API çç®æ æ¯ä¸ºç¨æ·æä¾ç®æ´æç¨ä¸ä¸å¹³å°æ å
³ç表达èå´å¹¿æ³çåé计ç®ã
è¿æ¯å¯¹æ°ç»å
ç´ çç®åæ é计ç®ï¼
```java
void scalarComputation(float[] a, float[] b, float[] c) {
for (int i = 0; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
```
è¿æ¯ä½¿ç¨ Vector API è¿è¡ççæåé计ç®ï¼
```java
static final VectorSpecies SPECIES = FloatVector.SPECIES_PREFERRED;
void vectorComputation(float[] a, float[] b, float[] c) {
int i = 0;
int upperBound = SPECIES.loopBound(a.length);
for (; i < upperBound; i += SPECIES.length()) {
// FloatVector va, vb, vc;
var va = FloatVector.fromArray(SPECIES, a, i);
var vb = FloatVector.fromArray(SPECIES, b, i);
var vc = va.mul(va)
.add(vb.mul(vb))
.neg();
vc.intoArray(c, i);
}
for (; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
```
尽管ä»å¨åµåä¸ï¼ä½å
¶ç¬¬å次è¿ä»£è¶³ä»¥è¯æå
¶éè¦æ§ãå®ä½¿å¾ Java å¨ç§å¦è®¡ç®ãæºå¨å¦ä¹ ãå¤§æ°æ®å¤ççæ§è½ææé¢åï¼è½å¤ç¼ååºæ¥è¿çè³åª²ç¾ C++çæ¬å°è¯è¨æ§è½ç代ç ãè¿æ¯ Java å¨é«æ§è½è®¡ç®é¢åä¿æç«äºåçå
³é®ã