7 คะแนน โดย GN⁺ 2025-03-19 | 4 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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

    • เพิ่ม system property ใหม่ jdk.tls.server.newSessionTicket
    • ตั้งค่าจำนวน TLSv1.3 resumption ticket บน JSSE server ได้ (ช่วง 0~10)
    • ค่าเริ่มต้นตั้งไว้ที่ 1
    • ตัวอย่างคำสั่ง:
      java -Djdk.tls.server.newSessionTicket=2
      
  • 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

    • เพิ่มออปชันใหม่ --dir และ -C ให้กับเครื่องมือ jar
    • สามารถแตกเนื้อหาของไฟล์ JAR ไปยังไดเรกทอรีที่กำหนดได้
    • ตัวอย่าง:
      jar -xf foo.jar -C /tmp/bar/
      jar --extract --file foo.jar --dir /tmp/bar/
      
  • 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

    • เพิ่มออปชัน --keep-old-files และ -k ให้กับเครื่องมือ jar
    • ป้องกันการเขียนทับไฟล์ที่มีอยู่เดิมได้
    • ตัวอย่าง:
      jar xkf foo.jar
      jar --extract --keep-old-files --file foo.jar
      
  • 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 ความคิดเห็น

 
clickin 2025-03-20

Project Valhalla อยู่ระหว่างการพัฒนามายาวนานมาก หวังว่าจะได้เห็นผลลัพธ์ที่ดีนะครับ
โดยส่วนตัวแล้วผมคาดหวังอย่างมากว่าการมีโครงสร้างแบบ flat ของ value class จะช่วยลดการอ้างอิงพอยน์เตอร์ลง และทำให้เกิดข้อได้เปรียบด้านความเร็วในการเข้าถึงหน่วยความจำ

 
tsboard 2025-03-20

ดูเหมือนว่าจะได้รับอิทธิพลเชิงบวกจาก Kotlin มาไม่น้อยเลยนะครับ ช่วงนี้ผมใช้ภาษา Kotlin แล้วพอใจมากจริง ๆ และก็ขอเอาใจช่วย Java ซึ่งเรียกได้ว่าเป็นต้นธารด้วยเช่นกัน

 
carnoxen 2025-03-19

Structured Concurrency กับ Scoped Value น่าคาดหวังมากครับ

 
GN⁺ 2025-03-19
ความเห็นจาก 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 ก็หายไป