- Oracle ประกาศเปิดตัว Java 24 (JDK 24) อย่างเป็นทางการ
- JDK 24 เป็น implementation อ้างอิงของ Java SE Platform เวอร์ชัน 24 ตามที่กำหนดไว้ใน JSR 399 ของ JCP และออกผ่าน JDK Release Process (JEP 3)
[สรุปตาม JEP]
-
JEP 404: Generational Shenandoah (ทดลอง)
- รองรับการเก็บกวาดแบบแบ่งรุ่นใน Shenandoah GC เพื่อปรับปรุงประสิทธิภาพ
-
JEP 450: Compact Object Headers (ทดลอง)
- ลดขนาด object header ใน HotSpot JVM จาก 96~128 บิต เหลือ 64 บิต
- คาดว่าจะช่วยลดขนาด heap เพิ่มความหนาแน่นในการ deploy และปรับปรุง data locality
-
JEP 472: Prepare to Restrict the Use of JNI
- เพิ่มคำเตือนเมื่อใช้ JNI (Java Native Interface)
- มีคำเตือนที่สอดคล้องกันใน External Function and Memory (FFM) API
- เตือนเพื่อเตรียมรับการจำกัดการใช้งาน JNI และ FFM API ในอนาคต
- แอปพลิเคชันสามารถเปิดใช้อินเทอร์เฟซนี้แบบเลือกได้เมื่อจำเป็น
-
JEP 475: Late Barrier Expansion for G1
- ทำให้การ implement Barrier ของ G1 garbage collector เรียบง่ายขึ้น
- ปรับจังหวะการขยาย Barrier จากช่วงต้นไปเป็นช่วงท้ายของ C2 JIT compiler
-
JEP 478: Key Derivation Function API (พรีวิว)
- เพิ่ม Key Derivation Function (KDF) API สำหรับฟังก์ชันการอนุมานคีย์เข้ารหัส
- สามารถอนุมานคีย์เพิ่มเติมจาก secret key และข้อมูลอื่น ๆ ได้
-
JEP 483: Ahead-of-Time Class Loading & Linking
- ทำให้ class ของแอปพร้อมใช้งานได้ทันทีเมื่อ HotSpot JVM เริ่มทำงาน
- แคชสถานะการโหลดและลิงก์จากการรันครั้งหนึ่งไว้ เพื่อให้เริ่มทำงานได้เร็วขึ้นในการรันครั้งถัดไป
-
JEP 484: Class-File API
- มี standard API สำหรับ การ parse, สร้าง และแปลง Java class file
-
JEP 485: Stream Gatherers
- รองรับการทำงานแบบ intermediate operation ที่ผู้ใช้กำหนดเองใน Stream API
- ทำให้แปลงข้อมูลที่ทำได้ยากด้วย intermediate operation เดิมสามารถทำได้
-
JEP 486: Permanently Disable the Security Manager
- Security Manager ไม่ได้เป็นกลไกความปลอดภัยหลักสำหรับโค้ดฝั่งไคลเอนต์อีกต่อไป
- ถูกปิดใช้งานเพื่อเตรียมการนำออกตามแผนที่ประกาศไว้ใน Java 17 (JEP 411)
- API ของ Security Manager จะถูกนำออกอย่างสมบูรณ์ในรีลีสถัดไป
-
JEP 487: Scoped Values (พรีวิวครั้งที่ 4)
- เพิ่ม Scoped Values สำหรับแชร์ข้อมูล immutable ภายใน thread กับ child thread
- ลดต้นทุนด้านหน่วยความจำและเวลาได้เมื่อเทียบกับ thread-local variable
- คาดว่าจะช่วยปรับปรุงประสิทธิภาพเมื่อใช้ร่วมกับ virtual thread และ structured concurrency
-
JEP 488: Primitive Types in Patterns, instanceof, and switch (พรีวิวครั้งที่ 2)
- รองรับ primitive type ใน pattern matching
- ใช้ primitive type ทุกชนิดได้ใน
instanceof และ switch
-
JEP 489: Vector API (incubator ครั้งที่ 9)
- เพิ่ม API สำหรับการคำนวณแบบเวกเตอร์
- คาดว่าจะได้ประสิทธิภาพสูงกว่าการคำนวณแบบ scalar เพราะคอมไพล์เป็นคำสั่งเวกเตอร์ได้
-
JEP 490: ZGC: Remove the Non-Generational Mode
- นำโหมด non-generational ของ ZGC ออก และตั้งโหมด generational เป็นค่าเริ่มต้น
-
JEP 491: Synchronize Virtual Threads without Pinning
- ปรับปรุงให้ virtual thread ปล่อย platform thread ได้ในคำสั่ง
synchronized
- ป้องกันไม่ให้ virtual thread ถูกตรึงกับ platform thread เพื่อปรับปรุงประสิทธิภาพและ scalability
-
JEP 492: Flexible Constructor Bodies (พรีวิวครั้งที่ 3)
- อนุญาตให้มี statement ก่อน explicit constructor invocation (
super(..), this(..))
- ทำให้สามารถกำหนดค่า field ได้ก่อนที่ instance จะถูก initialize สมบูรณ์
-
JEP 494: Module Import Declarations (พรีวิวครั้งที่ 2)
- เพิ่ม declaration สำหรับ import package ที่ export จากโมดูลได้อย่างง่ายขึ้น
- ทำให้การนำ modularized library กลับมาใช้ซ้ำง่ายขึ้น
-
JEP 495: Simple Source Files and Instance Main Methods (พรีวิวครั้งที่ 4)
- รองรับ source file และเมธอดแบบง่ายที่ผู้เริ่มต้นเขียนได้สะดวก
- ทำให้เขียนโปรแกรมง่าย ๆ ได้โดยไม่ต้องมีโค้ดซับซ้อน
-
JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
- เพิ่ม Module-Lattice-Based Key Encapsulation Mechanism (ML-KEM) ที่ต้านทานควอนตัม
- เสริมความปลอดภัยของ symmetric key และเตรียมพร้อมรับมือการโจมตีจาก quantum computing
-
JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm
- เพิ่ม Module-Lattice-Based Digital Signature Algorithm (ML-DSA) ที่ต้านทานควอนตัม
- เสริมการป้องกันการปลอมแปลงข้อมูลและการยืนยันตัวผู้ลงนาม
- รองรับการรับมือการโจมตีจาก quantum computing ในอนาคต
-
JEP 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe
- แสดงคำเตือนเมื่อใช้เมธอดเข้าถึงหน่วยความจำของ
sun.misc.Unsafe
- แนะนำให้ย้ายไปใช้ VarHandle API และ FFM API
-
JEP 499: Structured Concurrency (พรีวิวครั้งที่ 4)
- เพิ่ม structured concurrency สำหรับจัดการกลุ่มงานที่เกี่ยวข้องกันเป็นหน่วยงานเดียว
- ทำให้การจัดการข้อผิดพลาดและการยกเลิกง่ายขึ้น พร้อมเพิ่มความน่าเชื่อถือและการมองเห็นสถานะ
[สรุปฟีเจอร์ใหม่ใน JDK 24]
-
Configurable New Session Tickets Count for TLSv1.3
-
Mechanism to Disable TLS Cipher Suites by Pattern Matching
- ปิดใช้งาน TLS cipher suite ได้ผ่านพร็อพเพอร์ตี
jdk.tls.disabledAlgorithms ในไฟล์ตั้งค่า java.security
- รองรับ pattern matching (ใช้ wildcard
_ ได้)
- ตัวอย่าง:
"TLS_RSA_*" จะปิดใช้งาน cipher suite ทั้งหมดที่ขึ้นต้นด้วย TLS_RSA
-
New Option to Extract a JAR File to a Specific Directory Using the jar Tool
-
New Reader.of(CharSequence) Method
- เพิ่ม static factory method ใหม่
java.io.Reader.of(CharSequence)
- รองรับการอ่านจาก
String, StringBuilder และอื่น ๆ ได้อย่างมีประสิทธิภาพ
-
New Method Process.waitFor(Duration)
- เพิ่มเมธอด
java.lang.Process#waitFor(Duration)
- ช่วยป้องกันความสับสนเรื่องการกำหนดหน่วยเวลาใน
waitFor() แบบเดิม
-
Support for Unicode 16.0
- เพิ่มการรองรับ Unicode 16.0
- เพิ่มทั้งหมด 154,998 อักขระ และ 7 สคริปต์ใหม่
- Garay (แอฟริกาตะวันตก)
- Gurung Khema, Kirat Rai, Ol Onal, Sunuwar (อินเดียและเนปาล)
- Todhri (แอลเบเนีย)
- Tulu-Tigalari (อินเดียตะวันตกเฉียงใต้)
-
New JAR Command Option to Not Overwrite Existing Files
-
New MXBean to Monitor and Manage Virtual Thread Scheduler
- เพิ่มอินเทอร์เฟซ
jdk.management.VirtualThreadSchedulerMXBean
- ใช้มอนิเตอร์สถานะและระดับ parallelism ของ virtual thread scheduler ได้
- ปรับค่า target parallelism ของ scheduler แบบไดนามิกได้
-
New jcmd Commands Thread.vthread_scheduler and Thread.vthread_pollers
- เพิ่มคำสั่งใหม่ในเครื่องมือ
jcmd
Thread.vthread_scheduler: แสดงสถานะ thread scheduler
Thread.vthread_pollers: แสดงสถานะ I/O poller
-
Support for Including Security Properties Files
- สามารถ include ไฟล์พร็อพเพอร์ตีอื่นในไฟล์ตั้งค่า
java.security ได้
- ใช้
include <เส้นทางไฟล์>
- ไม่สามารถใช้คีย์เวิร์ด
include เป็นชื่อพร็อพเพอร์ตีได้
-
Document Standard Hash and MGF Algorithms for RSASSA-PSS Signature
- จัดทำเอกสารของ standard hash และ message generation function ที่ใช้ได้กับลายเซ็น RSASSA-PSS
-
SunPKCS11 Provider Is Enhanced to Use CKM_AES_CTS Mechanism
- เพิ่มการรองรับ AES/CTS transformation ใน SunPKCS11 provider
- เพิ่มพร็อพเพอร์ตีตั้งค่าใหม่
cipherTextStealingVariant (CS1, CS2, CS3)
- สำหรับ NSS จะตั้งค่าเริ่มต้นเป็น CS1
-
New Summary Page for External Specifications
- เพิ่มหน้าสรุปสำหรับดู external specification ที่ Java SE และ JDK API อ้างอิงได้ในที่เดียว
-
jpackage Supports WiX Toolset v4 and v5 on Windows
jpackage รองรับ WiX Toolset v4 และ v5 บน Windows แล้ว
- เลือกเวอร์ชันติดตั้งล่าสุดให้อัตโนมัติ
- แปลง custom source ในฟอร์แมต WiX v3 ไปเป็นฟอร์แมต v4 โดยอัตโนมัติ
-
Add W3C DTDs and XSDs to the JDK Built-in Catalog
- เพิ่ม W3C DTD และ XSD เข้าไปใน XML catalog แบบ built-in ของ JDK
- โหลดจากเครื่องได้โดยไม่ต้องใช้เครือข่าย
- รายการที่เพิ่ม:
- xml namespace
- XML Schema Part 1 & 2
- XHTML 1.0 & 1.1
- W3C XML specification DTD
4 ความคิดเห็น
Project Valhalla อยู่ระหว่างการพัฒนามายาวนานมาก หวังว่าจะได้เห็นผลลัพธ์ที่ดีนะครับ
โดยส่วนตัวแล้วผมคาดหวังอย่างมากว่าการมีโครงสร้างแบบ flat ของ value class จะช่วยลดการอ้างอิงพอยน์เตอร์ลง และทำให้เกิดข้อได้เปรียบด้านความเร็วในการเข้าถึงหน่วยความจำ
ดูเหมือนว่าจะได้รับอิทธิพลเชิงบวกจาก Kotlin มาไม่น้อยเลยนะครับ ช่วงนี้ผมใช้ภาษา Kotlin แล้วพอใจมากจริง ๆ และก็ขอเอาใจช่วย Java ซึ่งเรียกได้ว่าเป็นต้นธารด้วยเช่นกัน
Structured Concurrency กับ Scoped Value น่าคาดหวังมากครับ
ความเห็นจาก Hacker News
SecurityManagerถูกถอดออกไปแบบเงียบ ๆ อาจารย์ที่เคยสอนวิชาเลือก Java สมัยก่อนมักย้ำถึงข้อดีของSecurityManagerอยู่บ่อยครั้ง ตอนนั้นผมค่อนข้างสงสัยมาก และตอนนี้ก็พอใจที่ได้เห็นว่าความสงสัยนั้นถูกต้องอยากให้การพรีวิวของ structured concurrency จบเสียที สิ่งนี้จะช่วยปิดช่องว่างสุดท้ายที่ทำให้ Java ใช้งานเขียนโปรแกรมแบบ concurrent ได้ง่ายน้อยกว่า golang ฝั่ง Go ทำ channels และ wait groups ได้ง่าย ส่วน structured concurrency ช่วยให้เขียนและทำความเข้าใจงานระดับสูงขึ้นได้ง่ายโดยใช้โครงสร้างพื้นฐานเหล่านี้
การไม่มี virtual thread pinning เป็นข้อดีมาก ตอนนี้สามารถใช้ virtual threads ได้แทบไม่มีข้อจำกัดแล้ว
ดีที่เห็นว่า Streams ยังได้รับความนิยมอยู่ ที่บริษัทมีสัมภาษณ์สไตล์ fizzbuzz ค่อนข้างเยอะ และคนที่เลือก Java แล้วใช้ streams มักจะผ่านกันเป็นส่วนใหญ่ มันแสดงให้เห็นถึง ergonomics ของภาษา ความเป็นธรรมชาติในการใช้งาน และพลังของ abstraction Java streams ทรงพลังพอ ๆ กับ functional-style operation chains ของ Ruby แต่มีประสิทธิภาพจริงในการใช้งาน
ฟีเจอร์ใหม่: ลิงก์โครงการ OpenJDK 24
รีลีส ARM32 และ Risc-V จะตรวจสอบได้ที่ ที่นี่ เร็ว ๆ นี้
Raspberry 2 และ Vision Five 2 เป็นฮาร์ดแวร์ที่ล้ำยุคมาก ซึ่ง Oracle และ OpenJDK มองข้ามไป
มีคำถามเกี่ยวกับความแตกต่างด้านไลเซนส์ระหว่างการใช้ OpenJDK กับ Oracle JDK รุ่นทางการ
น่าแปลกที่ยังไม่มีใครพูดถึง JEP 491 ซึ่งทำให้มั่นใจได้ว่าคีย์เวิร์ด
"synchronized"จะไม่ทำลาย virtual threads นี่เป็นข้อดีมากสำหรับการรันโค้ดเดิมบน virtual threadsการเติบโตของเวอร์ชัน Java ในช่วงไม่กี่ปีที่ผ่านมาน่าสนใจมาก ผ่าน Java 9, 10, 11 LTS มาแล้ว แต่ก็ยังใช้ Java 8 อยู่ งานที่ต้องทำมีเยอะเกินไป
เมื่อเทียบ Java เวอร์ชันล่าสุดกับ Kotlin นั้น Java ยังคงพัฒนาอย่างต่อเนื่องและดึงฟีเจอร์ของ Kotlin มาใช้ ขณะที่ Kotlin เองก็กำลังพัฒนาต่อไปเช่นกัน
GraalVM ก็ใช้งานกับ Java 24 ได้เช่นกัน และมีฟีเจอร์ดี ๆ มากมาย
ในที่สุดปัญหา pinning ของ virtual threads ก็หายไป