JDK 25 正式發布,長期支持
JDK 25 是 LTS(長期支持版),至此為止,有 JDK8、JDK11、JDK17、JDK21 和 JDK 25 這四個長期支持版了。
JDK 25 共有 18 個新特性,這篇文章會挑選其中較為重要的一些新特性進行詳細介紹
語言特性
基本類型模式匹配(JEP 507)
JDK25作為第三次preview
在Java的模式匹配框架instanceof和switch中直接支持原始類型(如int、boolean),使這種表達式更加直接,減少樣板代碼,例如:
static void test(Object obj) {
if (obj instanceof int i) {
System.out.println("It's an int: " + i);
}
}
模塊導入聲明(JEP 511)
該特性第一次預覽是由 JEP 476(JDK 23 )提出,隨后在 JEP 494 (JDK 24)中進行了完善,JDK 25 順利轉正。
支持import module語句聲明模塊依賴,替代部分包導入,提升代碼可讀性和工具鏈兼容性,例如:
import module java.base; // 包含了import java.io.*; import java.util.*;
import module java.base; // exports java.util, which has a public Date class
import module java.sql; // exports java.sql, which has a public Date class
import java.sql.Date; // resolve the ambiguity of the simple name Date!
...
Date d = ... // Ok! Date is resolved to java.sql.Date
...
壓縮源文件與實例主方法(JEP 512)
該特性第一次預覽是由 JEP 445(JDK 21 )提出,隨后經過了 JDK 22 、JDK 23 和 JDK 24 的改進和完善,最終在 JDK 25 順利轉正。
簡化程序入口,支持類級別的void main()方法,無需public static修飾,允許我們在沒有類聲明的情況下編寫腳本或演示:
void main() {
System.out.println("Hello Java 25!");
}
這是為了降低 Java 的學習門檻和提升編寫小型程序、腳本的效率而邁出的一大步。初學者不再需要理解 public static void main(String[] args) 這一長串復雜的聲明。對于快速原型驗證和腳本編寫,這也使得 Java 成為一個更有吸引力的選擇。
靈活的構造函數體(JEP 513)
該特性第一次預覽是由 JEP 447(JDK 22)提出,隨后在 JEP 482 (JDK 23)和 JEP 492(JDK 24)經歷了預覽,JDK 25 順利轉正。
Java 要求在構造函數中,super(...) 或 this(...) 調用必須作為第一條語句出現。這意味著我們無法在調用父類構造函數之前在子類構造函數中直接初始化字段。
靈活的構造函數體解決了這一問題,它允許在構造函數體內,在調用 super(..) 或 this(..) 之前編寫語句,這些語句可以初始化字段,但不能引用正在構造的實例。這樣可以防止在父類構造函數中調用子類方法時,子類的字段未被正確初始化,增強了類構造的可靠性。
class User {
private final String id;
User(String rawId) {
super();
this.id = validateAndFormat(rawId);
}
}
性能優化
壓縮對象頭(JEP 519)
該特性第一次預覽是由 JEP 450 (JDK 24 )提出,JDK 25 就順利轉正了。
減少了64位體系結構上的對象頭大小,此更改通過在對象頭中使用緊湊的同步和標識數據布局,減少了Java對象的內存占用。
緊湊對象頭并沒有成為 JVM 默認的對象頭布局方式,需通過顯式配置啟用:
- JDK 24 需通過命令行參數組合啟用:
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders ...; - JDK 25 之后僅需
-XX:+UseCompactObjectHeaders即可啟用。
結構化并發(JEP505 第五次預覽)
JDK 19 引入了結構化并發,一種多線程編程方法,目的是為了通過結構化并發 API 來簡化多線程編程,并不是為了取代java.util.concurrent,目前處于孵化器階段。
結構化并發將將子任務視為邏輯單元,父任務取消時自動終止子線程,簡化錯誤處理和取消操作,防止資源泄漏,提升高并發可靠性。
結構化并發的基本 API 是StructuredTaskScope,它支持將任務拆分為多個并發子任務,在它們自己的線程中執行,并且子任務必須在主任務繼續之前完成。
StructuredTaskScope 的基本用法如下:
try (var scope = new StructuredTaskScope<Object>()) {
// 使用fork方法派生線程來執行子任務
Future<Integer> future1 = scope.fork(task1);
Future<String> future2 = scope.fork(task2);
// 等待線程完成
scope.join();
// 結果的處理可能包括處理或重新拋出異常
... process results/exceptions ...
} // close
結構化并發非常適合虛擬線程,虛擬線程是 JDK 實現的輕量級線程。許多虛擬線程共享同一個操作系統線程,從而允許非常多的虛擬線程。
分代 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即可啟用。
安全性增強
作用域值(ScopedValue)
替代ThreadLocal,支持線程間安全共享不可變數據,簡化生命周期管理。
JDK19的JEP 428: Structured Concurrency (Incubator)作為第一次incubator
JDK20的JEP 437: Structured Concurrency (Second Incubator)作為第二次incubator
JDK21的JEP 453: Structured Concurrency (Preview)作為首次preview
JDK22的JEP 462: Structured Concurrency (Second Preview)作為第二次preview
JDK23的JEP 480: Structured Concurrency (Third Preview)作為第三次preview
JDK24的JEP 487: Scoped Values (Fourth Preview)作為第四次preview,與JDK23不同的是callWhere以及runWhere方法從ScopedValue類中移除,可以使用ScopedValue.where()再鏈式調用run(Runnable)或者call(Callable)
JDK25作為第五次preview,有個改動就是 ScopedValue.orElse 方法不再接受null作為參數
class Framework {
private static final ScopedValue<FrameworkContext> CONTEXT
= ScopedValue.newInstance(); // (1)
void serve(Request request, Response response) {
var context = createContext(request);
where(CONTEXT, context) // (2)
.run(() -> Application.handle(request, response));
}
public PersistedObject readKey(String key) {
var context = CONTEXT.get(); // (3)
var db = getDBConnection(context);
db.readKey(key);
}
}
作用域值通過其“寫入時復制”(copy-on-write)的特性,保證了數據在線程間的隔離與安全,同時性能極高,占用內存也極低。這個特性將成為未來 Java 并發編程的標準實踐。
體驗優化
飛行記錄儀(JFR)升級
- 增強Linux系統CPU時間分析,精準定位性能瓶頸。
- 協作式采樣支持安全線程棧檢查,優化Java程序性能。
類文件 API 轉正
標準化類文件解析與生成接口,取代ASM等第三方庫。
垃圾回收器改進
- Shenandoah分代回收器正式轉正,優化內存管理效率。
- G1垃圾回收器增強后期屏障,減少停頓時間。
棄用陳舊特性
完全刪除32位x86平臺的支持,包括:
- 刪除相關源代碼(如
HotSpot虛擬機中的 x86-32 后端); - 移除構建配置、測試基礎設施中與 x86-32 相關的內容;
- 只保留對x86-64(64 位)平臺的支持,推動現代化硬件遷移。
本文來自在線網站:seven的菜鳥成長之路,作者:seven,轉載請注明原文鏈接:www.seven97.top

浙公網安備 33010602011771號