JCConf 2025 - Java 25 LTS in 2025 by Joseph

CyberJos 417 views 71 slides Sep 18, 2025
Slide 1
Slide 1 of 71
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71

About This Presentation

2025 年,我們躬逢 Java 平台誕生 30 週年的盛事,同時也迎來了關鍵的長期支援版本 Java 25 的發布。本次議程將帶領大家一同回顧並探討這個承先啟後版本所帶來的重大變革。內容將涵蓋今年上線的 Java 24 及 Java 25 的核心新特性,...


Slide Content

Java25LTSin
2025
Joseph Kuo(CyberJos)
VP of Technology @ NextDrive

About Me 網路⽼喬
Ø'93QBasic、'96 C/C++、'99Java
Ø資訊教育、雲端影⾳、電⼦商務、
資安防駭、⽤⼾⾏為、智慧物聯
ØJCConf、Oracle Groundbreakers、AWS Summit、
AWS Startup Day、物聯網年會、永續淨零論壇、…
Ø軟體⼯程、後端技術、設計架構、雲端邊緣、
智慧物聯、永續能源、資安稽核、技術教學
Ø希望能⼀輩⼦玩技術寫程式到⽼

Taiwan Java User Group
•FB:https://www.facebook.com/groups/twjug
•LINE 社群「Java 程式語⾔討論區」

Agenda (Draft)
●2025State of Java Ecosystem
●New Features in 24 & 25
●What's New in 26?

Agenda(Staging)
●2025State of Java Ecosystem
●New Features in 24 & 25 without the Following
○Gatherer
○Synchronize Virtual Threads without Pinning
○Scoped Values
○Structured Concurrency
○Stable Values
●What's New in 26?

The Journey of
JEPs which Jose
Jumped Over in
Java 24 & 25by
Joseph
Joseph Kuo(CyberJos)
VP of Technology @ NextDrive

Agenda (RC)
●2025State of Java Ecosystem
●New Features in 24 & 25
○Language Enhancement *
○API Library *
○Security
○Performance & Tooling
●What's New in 26?

依照慣例,先來個版本統計

2025 State of Java Ecosystem
Published by New Relic

2025 State of Java Ecosystem
●2020/03New Relic第⼀次發表Java報告
●2022/04發表Java 2022年度報告
●2023/04發表Java 2023年度報告
●2024/04發表Java 2024年度報告
●但,今年2025年沒有發表任何Java報告……
●哭哭,沒有東西可以抄了(誤)

來都來了

Agenda(Final)
●2025State of Java EcosystemSurvey & Report
●New Features in 24 & 25
○Language Enhancement
○API Library
○Security
○Performance & Tooling
●What's New in 26?

2025 State of Java
Survey & Report
Published by Azul

2025 State of Java Survey & Report
●2023/11Azul第⼀次發表Java2023 報告
●2025/02發表Java 2025年度報告
●問卷調查了超過2000位的Java 專業⼈⼠
●資料收集⽅式和內容與New Relic ⼤為不同
●https://www.azul.com/newsroom/azul-2025-
state-of-java-survey-report/

年度重點
●效能與可擴展性
虛擬執⾏緒和結構化並⾏讓開發者能夠更有效率地撰寫出
⾼效能、⾼並⾏的應⽤程式
●專注於開發⼈員的⽣產⼒
透過強化與各IDE、AI 整合等⼯具鏈的改進,為開發⼈員
提供更⽅便、更有效率的⼯作流程

年度重點
●韌性與安全性
對於量⼦安全加密(Quantum-safe encryption)的重
視,使其為未來密碼學的挑戰做好準備
●⼈⼯智慧、機器學習與雲端
豐富的函式庫與框架,使其成為AI/ML 開發的重要平台。
此外,它與AWS 和Google Cloud 等雲端原⽣平台的整
合,更提升了其在現代分散式應⽤程式中的實⽤性

2023Java 版本分佈(複選)

2025Java 版本分佈(複選)

Java 版本分佈⽐較

熱⾨Java 基礎建設(複選)

熱⾨Java 微服務框架(複選)

熱⾨AI程式語⾔(複選)

熱⾨Java AI函式庫(複選)

New Features in 24& 25
31featuresin total

Language Enhancement
語⾔改進

讓新⼿停步不前的「哈囉」
//HelloWorld.java
public classHelloWorld{
public staticvoidmain(String[]args) {
System.out.println("Hello, World!");
}
}1.需學習public與繼承和套件存取
2.需學習static與靜態和實例成員
3.寫class{}但⽤不到(類別)
4.傳String[]但沒⽤到(陣列、命令列)
5.需要解釋System.out.println物件導向

實例main⽅法
//HelloWorld.java
classHelloWorld{
voidmain() {
System.out.println("Hello, World!");
}
}1.允許main⽅法可以不⽤加上static
2.移除對於public⽅法的限制
3.移除對於String[]參數的限制

尋找可啟動的main⽅法
1.先尋找可傳⼊String[]參數的⾮私有main⽅法
1.該main⽅法可由類別本⾝宣告,或從⽗類別繼承⽽來
2.如果找不到,則尋找無參數的⾮私有main⽅法
3.如果找不到,則報告錯誤並終⽌
2.如果main⽅法是static,則直接呼叫
1.如果不是,則該類別必須要有無參數的⾮私有建構⼦
2.如果沒有此建構⼦,則報告錯誤並終⽌

精簡原始檔
//HelloWorld.java
voidmain() {
System.out.println("Hello, World!");
}1.屬於預設的未命名package
2.依檔名建⽴隱式宣告類別,且不實作任何介⾯
final classHelloWorldextendsObject
3.只會有無參數的預設建構⼦,且沒有其他建構⼦
4.精簡原始檔中的欄位和⽅法皆為其成員
5.必須擁有可啟動的main⽅法,否則會報告錯誤

與主控台互動
//HelloWorld.java
// import java.lang.IO;預設匯入java.lang
voidmain() {
IO.println("Hello, World!");
}publicstaticvoidprint(Objectobj)
publicstaticvoidprintln(Objectobj)
publicstaticvoidprintln()
publicstaticStringreadln(Stringprompt)
publicstaticStringreadln()

⾃動匯⼊模組
// import module java.base; 1)自動匯入模組
Stringhello() { return"Hello, "; }
voidmain() { IO.println(this.hello() + Test.get());}
classTest{//2)內部類別
staticStringget() { //3)↓直接用List
varlist = List.of("World!", "Moon!", "Guest!");
Stringname= IO.readln("Your name: "); //4)讀取輸⼊
return""!= name
?name//5)↓直接用Random
:list.get(newRandom().nextInt(list.size()));
}
}

執⾏結果

模糊匯⼊時的衝突解決
import modulejava.base;// 1)java.util.Date
import modulejava.sql; // 2)java.sql.Date
import java.sql.Date; //3)⽤單⼀型別匯⼊宣告遮蔽

遮蔽特異性由⾼⾄低
●單⼀型別匯⼊importjava.util.List;
●隨選型別匯⼊importjava.util.*;
●模組匯⼊import modulejava.base;

好孩⼦的匯⼊宣告順序
import moduleM1;// 模組匯⼊
import P1.*;//隨選型別匯⼊
import P2.C2;// 單⼀型別匯⼊
import static P3.C3.*; // 靜態成員匯⼊
import static P4.C4.M4;

建構時想檢查參數
classSub extends Super {
public Sub(inti) {
super(i); // ⽗類別已建構完成後才能檢查並拋出例外
if(i== 0) throw newRuntimeException();
}
}1.建構⼦主體第⼀句必須是super或是this
2.無法快速失敗:⼦類別建構⼦收到了錯誤傳
⼊值,必須要等⽗類別建構完成後才能拋出
例外

原有建構式階層的執⾏流程
classA{
A() {
super();
//Body
}
}
classB extends A{
B() {
super();
//Body
}
}
B
super--> A
super--> Object Body
--> A Body
B Body//此時A, B 已建構完成

彈性建構式結構
classB extends A {
B() {
//prologue前⾔
super();
//epilogue後語
}
}

彈性建構式階層的執⾏流程
classA{
A() {
//prologue
super();
//epilogue
}
}
classB extends A{
B() {
//prologue
super();
//epilogue
}
}
B prologue //尚未建構
super--> A prologue
super--> Object Body
--> A epilogue
B epilogue

彈性建構式前⾔的限制
classB extends A {
B(inti) {
//prologue前⾔
super(i);
//epilogue後語
}
}
Prologue 前⾔
1.可以驗證傳⼊的參數
2.可以輸出訊息
3.可以拋出例外(快速失敗)
4.僅可對未初始化的欄位賦值
5.不可對已初始化的欄位賦值
6.不可引⽤this與欄位和⽅法
7.不可引⽤super與欄位和⽅法
8.不能出現return

彈性建構式範例
classSub extends Super {
private intx; //1)未初始化欄位
private inty=10;//2)已初始化欄位
public Sub(inti) {//3)↓驗證傳入參數並拋出例外
if(i== 0) throw newRuntimeException();
this.x= 1_000 / i;//4)僅可對未初始化的欄位賦值
//this.y= i* 10;//5)不可對已初始化的欄位賦值
IO.println("i="+ i);//6)輸出訊息
//IO.println("x="+ this.x);//7)不可引用this
//IO.println("s.i="+ super.i);//8)不可引用super
//return; // 9)不可出現return
super(i);
}
}

執⾏結果
不可對已初始化的欄位賦值
不可顯式或隱式地存取this
不可顯式或隱式地存取super

API Library
函式庫

類別檔案:⽣成與解析
Consumer<ClassBuilder> fooBar= classBuilder-> {} // 1)
// 2)↓生成內容,類別名稱為T,內容由fooBar提供
byte[] b = ClassFile.of().build(ClassDesc.of("T"), fooBar);
Files.write(Paths.get("T.class"), b);
// 3)↓解析
ClassModelclassModel= ClassFile.of().parse(b);
for(ClassElementce: classModel) {
IO.println(ce);
}

類別檔案:轉換
// 1)轉換內容,將呼叫Foo.xxx()的地方改成呼叫Bar.xxx()
CodeTransformct= (builder, e) -> {
switch(e) {
caseInvokeInstructioniwhen// 2)如果是呼叫指令且為Foo
i.owner().asInternalName().equals("Foo") ->
builder.invoke(i.opcode(), ClassDesc.of("Bar"),
i.name().stringValue(),// 3)↑換成Bar
i.typeSymbol(), i.isInterface());
default-> builder.accept(e);
}};
MethodTransformmt = MethodTransform.transformingCode(ct);// 4)
ClassTransformclsT= ClassTransform.transformingMethods(mt);// 5)
ClassFilecf= ClassFile.of();
byte[] b = cf.transformClass(cf.parse(classBytes), clsT);// 6)

更多內容請google「類別檔案API」

名稱對應功能使⽤場景
fold多對⼀消化元素、更新狀態並計算
結果
平均值、總和、計
數、最⼤最⼩值
scan⼀對⼀
消化元素並與內部狀態整
合,計算累積中間值並產⽣
新元素
前綴和、累積乘積、
費式數列
mapConcurrent⼀對⼀對每個輸⼊元素並⾏地呼叫
函式,最多達到設定的上限
下載、讀檔、圖⽚運
算、複雜運算
windowFixed多對多將元素依數量分組,在窗⼝
滿時向下傳遞
批次處理、緩衝區讀

windowSliding多對多
同上且為滑動窗⼝。後窗⼝
將前窗⼝的⾸元素刪除後附
加新元素
移動平均、局部最⼤
最⼩值
聚集器:串流的中間操作

foldvs. scan
Stream.of(1, 2, 3, 4)
.gather(Gatherers.fold(()->0, (a,b)->a+b))
.toList(); // 總和: [10]
Stream.of(1, 2, 3, 4)
.gather(Gatherers.scan(()->0, (a,b)->a+b))
.toList(); // 前綴和: [1, 3, 6, 10]

windowFixedvs. windowSliding
Stream.of(1, 2, 3, 4)//scan: [1, 3, 6, 10]
.gather(Gatherers.scan(() -> 0, (a, b) -> a + b))
.gather(Gatherers.windowFixed(2))
.map(w -> (w.get(0) + w.get(1)) / 2.0) //需為偶數
.toList(); // 區間平均: [2.0, 8.0]
Stream.of(1, 2, 3, 4)//scan: [1, 3, 6, 10]
.gather(Gatherers.scan(() -> 0, (a, b) -> a + b))
.gather(Gatherers.windowSliding(2))
.map(w -> (w.get(0) + w.get(1)) / 2.0)
.toList(); //移動平均: [2.0, 4.5, 8.0]

Gatherer介⾯⽅法
●initializer():建⽴物件,在處理串流元素時可
維護內部狀態,例如暫存、計數、緩衝等
●integrator():從輸⼊串流接收新元素、更新內
部狀態、新增元素到下游串流、或終⽌處理
●combiner():並⾏處理時合併聚集器內部狀態
●finisher():沒有輸⼊元素時做最終處理,例如
拋出異常

實作Gatherer去重
recordDeduplicator<T, U>(Function<T, U> fun)// 1)用lambda 判斷去重方式
implementsGatherer<T, Map<U, T>, T> {// 2)實作Gatherer介面
// 3)↓內部狀態使用map 儲存
publicSupplier<Map<U, T>> initializer() {returnHashMap<U, T>::new; }
publicGatherer.Integrator<Map<U, T>, T, T> integrator() {
returnGatherer.Integrator.ofGreedy(// 4)建立integrator
(map, e, downstream) ->
map.putIfAbsent(fun.apply(e), e) == null // 5)檢查put傳回值
? downstream.push(e) // 6)空值代表未加入故輸出元素至下游
: true// 7)不為空代表已重複,故略過
);
}
// 8)靜態建構器方法(此類別省略了combiner 和finisher)
publicstatic<T, U> Deduplicator<T, U> of(Function<T, U> fun) {
returnnewDeduplicator<>(fun); // 9)用lambda 判斷去重方式
}
}

使⽤Gatherer去重
Stream.of("foo", "bar", "baz", "quux", "ab", "test", "cd")
.gather(Deduplicator.of(String::length))// 1)字串長度比對
.toList();
// ==> [foo, quux, ab]
Stream.of("foo", "bar", "Bar", "BAZ", "baz", "FOO", "Ab", "AB")
.gather(Deduplicator.of(String::toUpperCase))//2)轉大寫比對
.toList();
// ==> [foo, bar, BAZ, Ab]

範圍值:傳遞∕共享不可變物件
static finalScopedValue<String>NAME=ScopedValue.newInstance(); // 1)
voidmain() { // 2)程式進入點
ScopedValue.where(NAME, "Hello!").run(() -> invokeA()); //3)綁定→清理
}
voidinvokeA() {
IO.println("invokeA()1: "+ NAME.get());// 4)輸出
ScopedValue.where(NAME, "Hi!").run(() -> invokeB());//5)重新綁定→清理
IO.println("invokeA()2: "+ NAME.get());// 6)輸出
invokeB(); //7)直接呼叫
}
voidinvokeB() { IO.println("invokeB(): "+ NAME.get()); }
//invokeA()1: Hello!à4)
//invokeB():Hi!à5)
//invokeA()2: Hello!à6)
//invokeB():Hello!à7)

範圍值的應⽤
1.where(k,v).run(op)
2.returnwhere(k,v).call(op);
3.where(k1,v1).where(k2,v2).run(op)
4.where(k,v1).run(()->where(k,v2).run(op))
5.where(k,v).run(() ->
Thread.ofVirtual().start(op) * 1_000)
6.where(k,v).run(() -> {
try(vars = StructuredTaskScope.open()) {
s.fork(op1); s.fork(op2); s.join();}})
1.基本型
2.有回傳值
3.多重綁定
4.巢狀綁定(如前⾴)
5.與⼦虛擬執⾏緒共享
6.結構化並⾏

不可變物件的延遲載⼊
classTest {
staticfinalConfigC =newConfig();//1)不一定會用到
// 2)private finalLogger logger = Logger.create(xxx)
privateLoggerlogger = null;//3)←想要延遲載入
LoggergetLogger() {//4)但需考慮同步問題
if (logger == null) { //5)有些人會用DCLpattern
logger = Logger.create(Test.class));
}
returnlogger;
}
}

穩定值:初始化後就穩定不變
classTest { //1)↓建立穩定值物件
privatefinalStableValue<Logger> l = StableValue.of();
LoggergetLogger() { // 2)↓若無則初始化(thread-safety)
returnl.orElseSet(()->Logger.create(Test.class));
}
voidrun(){
getLogger().info(xxx);//3)第一次呼叫時會建立物件
getLogger().warn(yyy);//4)之後會直接取得物件
}
}

Singletonby DCL 雙重檢查鎖定
publicclassSingleton{
privatestaticvolatileSingletonINSTANCE;
publicstaticSingletongetInstance() {
if(INSTANCE== null)
synchronized(Singleton.class) {
if(INSTANCE== null)
INSTANCE= newSingleton();
}
returnINSTANCE;
}
privateSingleton() {}
}

Singletonby Bill Pugh靜態內部類別
publicclassSingleton{
privatestaticclassHolder{
privatestaticfinalSingletonINSTANCE=
newSingleton();
}
publicstaticSingletongetInstance() {
returnHolder.INSTANCE;
}
privateSingleton() {}
}

Singletonby 穩定值
publicclassSingleton{
privatestaticfinalStableValue<Singleton>INSTANCE=
StableValue.of();
publicstaticSingletongetInstance() {
returnINSTANCE.orElseSet(Singleton::new);
}
privateSingleton() {}
}

Security
安全性

安全性加強
●限制JNI 使⽤的準備⼯作
○使⽤JNI 時會發出警告,如同使⽤FFM API 時⼀樣
●永久停⽤安全管理器
○它已不再是保護客⼾端程式碼的主要⽅式,17時已棄⽤
○宣告Java Applet 的正式終結
●使⽤sun.misc.Unsafe的記憶體⽅法會發出警告
○功能已由VarHandleAPI和FFM API 所取代

密碼學
●基於模格的抗量⼦⾦鑰封裝機制
○使⽤公鑰密碼學透過不安全的通訊通道保護對稱⾦ 鑰
●基於模格的抗量⼦數位簽章演算法
○⽤於檢測對資料未經授權的修改,並驗證簽名者的⾝份
●密鑰派⽣函數API
○從密鑰和其他數據派⽣出其他⾦鑰的密碼演算法,應⽤
於加密和⾝份驗證

Performance & Tooling
效能與⼯具

GC
●分代模式的Shenandoah 垃圾收集器
○提⾼可持續的吞吐量、負載⾼峰彈性和記憶體利⽤率
●移除ZGC 垃圾收集器的未分代模式
●G1 垃圾收集器的屏障擴展機制
○從C2 JIT 編譯管道的早期階段移⾄後期階段以簡化其
實作
○可減少C2 的執⾏時間

JVM
●壓縮物件標頭
○刪除物件標頭中的未使⽤空間和壓縮標頭 資訊,以減少
物件記憶體佔⽤並提⾼效能
●同步虛擬執⾏緒時的解綁機制
○被synchronized阻塞的虛擬執⾏緒可釋放其底層平台
執⾏緒,讓其他虛擬執⾏緒能夠使⽤

Ahead-of-Time(AOT)預先編譯
●類別的載⼊和連結功能
○將應⽤程式的類別以載⼊和連結的狀態⽴即載⼊,以縮
短啟動時間
●指令列⼈因⼯程學
○簡化建⽴預先編譯快取的流程
●⽅法執⾏描述檔
○讓上⼀次程式執⾏時的⽅法執⾏描述檔於 JVM 啟動時
⽴即可⽤,進⽽改善Java 程式的暖機時間

JDK ⾶⾏紀錄器(JFR)
●CPU 時間分析資訊
○在Linux 平台上捕獲更精確的CPU 時間分析資訊
●協作式採樣
○提升⾮同步採樣執⾏緒堆疊時的穩定性,並同時盡可能
減少安全點偏差的影響
●⽅法計時與追蹤
○使⽤位元組碼插樁(bytecode instrumentation)來提
供⽅法計時和追蹤功能

What's New in 26?
3features so far

What'sNew in 26
●移除Applet API
●HTTP Client API ⽀援HTTP/3
●G1 GC:減少同步次數以增加吞吐量

Q&A

Thank You