---
title: Java 26 æ°ç¹æ§æ¦è§
description: æ¦è§ JDK 26 çå
³é®æ°ç¹æ§ä¸é¢è§æ¹å¨ï¼å
³æ³¨ HTTP/3ãGC æ§è½ä¼åãAOT ç¼åä¸è¯è¨/å¹³å°å¢å¼ºã
category: Java
tag:
- Javaæ°ç¹æ§
head:
- - meta
- name: keywords
content: Java 26,JDK26,HTTP/3,G1 GC,AOT ç¼å,å»¶è¿å¸¸é,ç»æåå¹¶å,åé API,模å¼å¹é
---
JDK 26 äº 2026 å¹´ 3 æ 17 æ¥ åå¸ï¼è¿æ¯ä¸ä¸ªé LTSï¼éé¿ææ¯æçï¼çæ¬ãä¸ä¸ä¸ªé¿ææ¯æçæ¯ **JDK 25**ï¼ä¸ä¸ä¸ªé¿ææ¯æçé¢è®¡æ¯ **JDK 29**ã
JDK 26 å
±æ 10 个æ°ç¹æ§ï¼è¿ç¯æç« 伿éå
¶ä¸è¾ä¸ºéè¦çä¸äºæ°ç¹æ§è¿è¡è¯¦ç»ä»ç»ï¼
- [JEP 517: HTTP/3 for the HTTP Client API (为 HTTP Client API å¼å
¥ HTTP/3 æ¯æ)](https://openjdk.org/jeps/517)
- [JEP 522: G1 GC: Improve Throughput by Reducing Synchronization (G1 GC ååéä¼å)](https://openjdk.org/jeps/522)
- [JEP 516: Ahead-of-Time Object Caching with Any GC (AOT 对象ç¼åæ¯æä»»æ GC)](https://openjdk.org/jeps/516)
- [JEP 500: Prepare to Make Final Mean Final (åå¤è®© final çæ£ä¸å¯å)](https://openjdk.org/jeps/500)
- [JEP 526: Lazy Constants (å»¶è¿å¸¸é, ç¬¬äºæ¬¡é¢è§)](https://openjdk.org/jeps/526)
- [JEP 525: Structured Concurrency (ç»æåå¹¶å, 第å
次é¢è§)](https://openjdk.org/jeps/525)
- [JEP 530: Primitive Types in Patterns, instanceof, and switch (模å¼å¹é
æ¯æåºæ¬ç±»å, ç¬¬åæ¬¡é¢è§)](https://openjdk.org/jeps/530)
- [JEP 524: PEM Encodings of Cryptographic Objects (å å¯å¯¹è±¡ PEM ç¼ç , ç¬¬äºæ¬¡é¢è§)](https://openjdk.org/jeps/524)
- [JEP 529: Vector API (åé API, 第å䏿¬¡åµå)](https://openjdk.org/jeps/529)
- [JEP 504: Remove the Applet API (ç§»é¤ Applet API)](https://openjdk.org/jeps/504)
ä¸å¾æ¯ä» JDK 8 å° JDK 25 æ¯ä¸ªçæ¬çæ´æ°å¸¦æ¥çæ°ç¹æ§æ°éåæ´æ°æ¶é´ï¼

## JEP 517: 为 HTTP Client API å¼å
¥ HTTP/3 æ¯æ
JDK 26 为 `java.net.http.HttpClient` API æ£å¼æ·»å äº **HTTP/3** æ¯æï¼è¿æ¯ä¸ä¸ªæå¾
å·²ä¹
çéè¦æ´æ°ã
**HTTP/3 çä¼å¿**ï¼
- **åºäº QUIC åè®®**ï¼HTTP/2 æ¯åºäº TCP åè®®å®ç°çï¼HTTP/3 æ°å¢äº QUICï¼Quick UDP Internet Connectionsï¼ åè®®æ¥å®ç°å¯é çä¼ è¾ï¼æä¾ä¸ TLS/SSL ç¸å½çå®å
¨æ§ï¼å
·æè¾ä½çè¿æ¥åä¼ è¾å»¶è¿ãä½ å¯ä»¥å° QUIC ç使¯ UDP çåçº§çæ¬ï¼å¨å
¶åºç¡ä¸æ°å¢äºå¾å¤åè½æ¯å¦å å¯ãéä¼ ççã
- **æ¶é¤é头é»å¡**ï¼HTTP/2 å¤è¯·æ±å¤ç¨ä¸ä¸ª TCP è¿æ¥ï¼ä¸æ¦åç丢å
ï¼å°±ä¼é»å¡ä½ææç HTTP 请æ±ãç±äº QUIC åè®®çç¹æ§ï¼HTTP/3 å¨ä¸å®ç¨åº¦ä¸è§£å³äºé头é»å¡ï¼Head-of-Line blocking, ç®åï¼HOL blockingï¼é®é¢ï¼ä¸ä¸ªè¿æ¥å»ºç«å¤ä¸ªä¸åçæ°æ®æµï¼è¿äºæ°æ®æµä¹é´ç¬ç«äºä¸å½±åï¼æä¸ªæ°æ®æµåç丢å
äºï¼å
¶æ°æ®æµä¸åå½±åï¼æ¬è´¨ä¸æ¯å¤è·¯å¤ç¨+轮询ï¼ã
- **æ´å¿«çè¿æ¥å»ºç«**ï¼HTTP/2 éè¦ç»è¿ç»å
¸ç TCP 䏿¬¡æ¡æè¿ç¨ï¼ç±äºå®å
¨ç HTTPS è¿æ¥å»ºç«è¿éè¦ TLS æ¡æï¼å
±éè¦å¤§çº¦ 3 个 RTTï¼ãç±äº QUIC åè®®çç¹æ§ï¼TLS 1.3ï¼TLS 1.3 é¤äºæ¯æ 1 个 RTT çæ¡æï¼è¿æ¯æ 0 个 RTT çæ¡æï¼è¿æ¥å»ºç«ä»
é 0-RTT æè
1-RTTãè¿æå³ç QUIC 卿佳æ
åµä¸ä¸éè¦ä»»ä½çé¢å¤å¾è¿æ¶é´å°±å¯ä»¥å»ºç«æ°è¿æ¥ã
- **æ´å¥½çç§»å¨ç«¯ä½éª**ï¼HTTP/3.0 æ¯æè¿æ¥è¿ç§»ï¼å 为 QUIC ä½¿ç¨ 64 ä½ ID æ è¯è¿æ¥ï¼åªè¦ ID ä¸åå°±ä¸ä¼ä¸æï¼ç½ç»ç¯å¢æ¹åæ¶ï¼å¦ä» Wi-Fi 忢å°ç§»å¨æ°æ®ï¼ä¹è½ä¿æè¿æ¥ãè TCP è¿æ¥æ¯ç±ï¼æº IPï¼æºç«¯å£ï¼ç®ç IPï¼ç®ç端å£ï¼ç»æï¼è¿ä¸ªåå
ç»ä¸ä¸æ¦æä¸é¡¹å¼åçæ¹åï¼è¿ä¸ªè¿æ¥ä¹å°±ä¸è½ç¨äºã
详ç»ä»ç»å¯ä»¥é
读è¿ç¯æç« ï¼[è®¡ç®æºç½ç»å¸¸è§é¢è¯é¢æ»ç»ï¼ä¸ï¼](https://javaguide.cn/cs-basics/network/other-network-questions.html)ï¼ç½ç»å屿¨¡åã常è§ç½è·¯åè®®æ»ç»ãHTTPãWebSocketãDNS çï¼
**ä½¿ç¨æ¹å¼**ï¼
HTTP/3 ç使ç¨é常ç®åï¼å ä¹ä¸éè¦ä¿®æ¹ç°æä»£ç ã`HttpClient` ä¼èªå¨ååä½¿ç¨æé«çæ¬ç HTTP åè®®ï¼
```java
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
// 妿æå¡å¨æ¯æ HTTP/3ï¼HttpClient ä¼èªå¨å级使ç¨
HttpResponse response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
```
妿éè¦æç¡®æå®ä½¿ç¨ HTTP/3ï¼å¯ä»¥éè¿ `version()` æ¹æ³è®¾ç½®ï¼
```java
// ææè¯·æ±é»è®¤ä¼å
ä½¿ç¨ HTTP/3
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_3) // æç¡®æå® HTTP/3
.build();
// 设置å个HttpRequest对象çé¦éåè®®çæ¬
HttpRequest request = HttpRequest.newBuilder(URI.create("https://javaguide.cn/"))
.version(HttpClient.Version.HTTP_3)
.GET().build();
```
## JEP 522: G1 GC ååéä¼å
**ä» JDK9 å¼å§ï¼G1 å徿¶éå¨æä¸ºäºé»è®¤çå徿¶éå¨ã** å®å¨å»¶è¿åååéä¹é´å¯»æ±å¹³è¡¡ãç¶èï¼è¿ç§å¹³è¡¡ææ¶ä¼å½±ååºç¨ç¨åºçæ§è½ãä¸é¢åååéç Parallel GC ç¸æ¯ï¼G1 æ´å¤å°ä¸åºç¨ç¨åºå¹¶åå·¥ä½ï¼ä»¥åå° GC æåæ¶é´ãä½è¿æå³çåºç¨çº¿ç¨å¿
é¡»ä¸ GC 线ç¨å
±äº« CPU å¹¶è¿è¡åè°ï¼è¿ç§åæ¥ä¼éä½ååéå¹¶å¢å å»¶è¿ã
JEP 522 å¼å
¥äº**åå¡è¡¨ï¼Card Tableï¼**æºå¶ï¼
1. **第ä¸å¼ å¡è¡¨**ï¼åºç¨çº¿ç¨çåå±é卿´æ°è¿å¼ å¡è¡¨æ¶**æ éä»»ä½åæ¥**ï¼ä½¿å¾åå±éä»£ç æ´ç®åãæ´å¿«éã
2. **第äºå¼ å¡è¡¨**ï¼ä¼åå¨çº¿ç¨å¨åå°å¹¶è¡å¤çè¿å¼ åå§ä¸ºç©ºçå¡è¡¨ã
å½ G1 æ£æµå°æ«æç¬¬ä¸å¼ å¡è¡¨å¯è½è¶
è¿æåæ¶é´ç®æ æ¶ï¼å®ä¼ååæ§å°äº¤æ¢è¿ä¸¤å¼ å¡è¡¨ãåºç¨çº¿ç¨ç»§ç»æ´æ°ç©ºçãåå
ç第äºå¼ 表ï¼èä¼åå¨çº¿ç¨åå¤ç满çãåå
ç第ä¸å¼ è¡¨ï¼æ éè¿ä¸æ¥åæ¥ã
**æ§è½æåææ**ï¼
- å¨**é¢ç¹ä¿®æ¹å¯¹è±¡å¼ç¨å段**çåºç¨ä¸ï¼ååéæå **5-15%**
- å³ä½¿å¨ä¸é¢ç¹ä¿®æ¹å¼ç¨å段çåºç¨ä¸ï¼ç±äºåå±éç®åï¼x64 ä¸ä»çº¦ 50 æ¡æä»¤åå°å°ä»
12 æ¡ï¼ï¼ååéä¹è½æåé«è¾¾ **5%**
- GC æåæ¶é´ä¹æ**轻微ä¸é**
**å
åå¼é**ï¼
第äºå¼ å¡è¡¨ä¸ç¬¬ä¸å¼ 容éç¸åï¼æ¯å¼ å¡è¡¨éè¦ Java å 容éç 0.2%ï¼å³æ¯ 1GB å å
åé¢å¤ä½¿ç¨çº¦ 2MB åçå
åã
## JEP 516: AOT 对象ç¼åæ¯æä»»æ GC
è¿æ¯ **Project Leyden** çéè¦éç¨ç¢ï¼ä½¿å¾æåï¼AOTï¼å¯¹è±¡ç¼åè½å¤ä¸**ä»»æå徿¶éå¨**é
å使ç¨ã
ä¹åå¨ JDK 24 ä¸å¼å
¥ç AOT ç±»æ°æ®å
±äº«ï¼JEP 483ï¼åªæ¯æ G1 å徿¶éå¨ï¼æ æ³ä¸ ZGC çå
¶ä» GC é
å使ç¨ãè¿æ¯å 为 AOT ç¼åä¸åå¨ç对象å¼ç¨ä½¿ç¨çæ¯ç©çå
åå°åï¼èä¸å GC çå
åå¸å±å对象移å¨çç¥ä¸åã
JEP 516 å°å¯¹è±¡å¼ç¨çå卿¹å¼ä»**ç©çå
åå°å**æ¹ä¸º**é»è¾ç´¢å¼**ï¼
- ä½¿ç¨ GC æ å
³çæµå¼æ ¼å¼åå¨ç¼å
- ç¼åå¯ä»¥å¨è¿è¡æ¶è¢«ä»»æ GC å è½½åè§£æ
- JVM å¨å è½½æ¶å°é»è¾ç´¢å¼è½¬æ¢ä¸ºå®é
çå
åå°å
**æ§è½æ¶ç**ï¼
- **å¯å¨æ¶é´ä¼å**ï¼æ¾èåå° Java åºç¨çå·å¯å¨æ¶é´
- **æ¯æ ZGC**ï¼ä½å»¶è¿ç ZGC ç°å¨ä¹è½äº«å AOT ç¼å带æ¥çå¯å¨å é
- **äºåçå好**ï¼å¯¹äºå¾®æå¡åæ æå¡å¨å½æ°çå¯å¨æ¶é´ææçåºæ¯ç¹å«æä»·å¼
## JEP 500: åå¤è®© final çæ£ä¸å¯å
è¿ä¸ªç¹æ§ä¸º Java ç宿´æ§ä¼å
ååéºå¹³éè·¯ï¼åå¤è®© `final` åæ®µçæ£åå¾ä¸å¯åã
ä» JDK 1.0 å¼å§ï¼Java ç `final` åæ®µå®é
ä¸å¯ä»¥éè¿**深度åå°**被修æ¹ï¼
```java
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Example {
private final String name = "Original";
public String getName() {
return name;
}
}
// éè¿åå°ä¿®æ¹ final åæ®µ
Example example = new Example();
Field field = Example.class.getDeclaredField("name");
field.setAccessible(true);
// ç§»é¤ final 修饰符
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(example, "Modified"); // æåä¿®æ¹äº final åæ®µï¼
System.out.println(example.getName()); // è¾åº "Modified"
```
è¿ç§è½åè½ç¶è¢«ä¸äºæ¡æ¶ï¼å¦åºåååºãä¾èµæ³¨å
¥æ¡æ¶ãæµè¯å·¥å
·ï¼ä½¿ç¨ï¼ä½ç ´åäº `final` çä¸å¯åæ§ä¿è¯ï¼ä¹é»ç¢äºç¼è¯å¨ä¼åã
å¨ JDK 26 ä¸ï¼å½éè¿æ·±åº¦åå°ä¿®æ¹ `final` åæ®µæ¶ï¼JVM ä¼**ååºè¦å**ãè¿æ¯ä¸ºæªæ¥çæ¬ä¸é»è®¤ç¦æ¢æ¤ç±»æä½ååå¤ã
对äºç¡®å®éè¦ä¿®æ¹ `final` åæ®µçåºæ¯ï¼JDK 26 æä¾äºæ¾å¼çéæ©æºå¶ï¼å
许å¼åè
å¨è¿æ¸¡æç»§ç»ä½¿ç¨æ¤è½åï¼åæ¶ä¸ºæªæ¥çä¸¥æ ¼æ¨¡å¼å好åå¤ã
## JEP 526: å»¶è¿å¸¸é (ç¬¬äºæ¬¡é¢è§)
è¯¥ç¹æ§ç¬¬ä¸æ¬¡é¢è§æ¯ç± [JEP 501](https://openjdk.org/jeps/501) ï¼JDK 25ï¼æåºï¼JDK 26 æ¯ç¬¬äºæ¬¡é¢è§ã
ä¼ ç»ç `static final` åæ®µå¨ç±»å è½½æ¶å°±ä¼åå§åï¼è¿ä¼ï¼
- å¢å å¯å¨æ¶é´ã
- å¦æè¯¥å¸¸é仿ªè¢«ä½¿ç¨ï¼å浪费å
åã
- éè¦å¤æçå»¶è¿åå§å模å¼ï¼å¦å鿣æ¥éå®ãHolder 类模å¼çï¼ã
JEP 526 å¼å
¥äº `LazyConstant`ï¼ä¸ç§ææä¸å¯åæ°æ®ç对象ï¼JVM å°å
¶è§ä¸ºçæ£ç常éï¼ä»¥è·å¾ä¸å£°æ `final` åæ®µç¸åçæ§è½ã
```java
// ä¼ ç»æ¹å¼ï¼ç±»å è½½æ¶ç«å³åå§å
static final ExpensiveObject TRADITIONAL = new ExpensiveObject();
// æ°æ¹å¼ï¼é¦æ¬¡è®¿é®æ¶æåå§å
static final LazyConstant LAZY =
LazyConstant.of(() -> new ExpensiveObject());
// ä½¿ç¨æ¶
ExpensiveObject obj = LAZY.get(); // æ¤æ¶æåå§å
```
**ä¼å¿**ï¼
- **æéåå§å**ï¼åªå¨é¦æ¬¡è®¿é®æ¶åå§åï¼æåå¯å¨æ§è½ã
- **线ç¨å®å
¨**ï¼å
置线ç¨å®å
¨ä¿è¯ï¼æ éæå¨åæ¥ã
- **JVM ä¼å**ï¼JVM å¯ä»¥å对å¾
`final` åæ®µä¸æ ·ä¼åå»¶è¿å¸¸éã
- **ç®å代ç **ï¼æ¶é¤å鿣æ¥éå®ç夿çå»¶è¿åå§å模å¼ã
## JEP 525: ç»æåå¹¶å (第å
次é¢è§)
JDK 19 å¼å
¥äºç»æåå¹¶åï¼ä¸ç§å¤çº¿ç¨ç¼ç¨æ¹æ³ï¼ç®çæ¯ä¸ºäºéè¿ç»æåå¹¶å API æ¥ç®åå¤çº¿ç¨ç¼ç¨ï¼å¹¶ä¸æ¯ä¸ºäºå代`java.util.concurrent`ï¼ç®åå¤äºåµåå¨é¶æ®µã
ç»æåå¹¶åå°ä¸å线ç¨ä¸è¿è¡çå¤ä¸ªä»»å¡è§ä¸ºå个工ä½åå
ï¼ä»èç®åé误å¤çãæé«å¯é æ§å¹¶å¢å¼ºå¯è§å¯æ§ãä¹å°±æ¯è¯´ï¼ç»æåå¹¶åä¿çäºå线ç¨ä»£ç çå¯è¯»æ§ãå¯ç»´æ¤æ§åå¯è§å¯æ§ã
ç»æåå¹¶åçåºæ¬ API æ¯`StructuredTaskScope`ï¼å®æ¯æå°ä»»å¡æå为å¤ä¸ªå¹¶ååä»»å¡ï¼å¨å®ä»¬èªå·±ç线ç¨ä¸æ§è¡ï¼å¹¶ä¸åä»»å¡å¿
é¡»å¨ä¸»/ç¶ä»»å¡ç»§ç»ä¹å宿æè
åä»»å¡é主/ç¶ä»»å¡å¤±è´¥èåæ¶ã
`StructuredTaskScope` çåºæ¬ç¨æ³å¦ä¸ï¼
```java
try (var scope = new StructuredTaskScope