Welcome to the first OpenJDK Quality Outreach update of 2026.
The first Release Candidate builds of JDK 26 are now available[1]. At this stage, only P1 issues will be considered for evaluation. The focus is now rapdily shifting to early access testing of JDK 27. JDK 26 will officially launch at JavaOne[2] in California next month. If you’re attending or considering attending, please let me know, as I am planning an informal Quality Outreach gathering. I also have a very limited number of complimentary passes available for active QO project members. If you are interested, please email me to request one. And as usual, don't forget to review the heads-up below. [1] https://jdk.java.net/26/ [2] https://javaone.com/ # Heads-Up - JDK 26: DecimalFormat Uses the Double.toString(double) Algorithm Since JDK 21, `java.text.DecimalFormat::format` and `java.util.Formatter::toString` produce slightly different outcomes on some double values. This rare situation occurs due to the fact that `java.util.Formatter`, together with `Double.toString()`, got its algorithm enhanced in JDK 21. A fix was introduced in JDK 26 for the `java.text.DecimalFormat` implementation to use the same algorithm as `java.util.Formatter` and `Double.toString()`, thus producing the same outcome. For more details, please check article[3]. [3] https://inside.java/2026/02/09/quality-heads-up/ # Heads-Up - JDK 27: Removal of `ThreadPoolExecutor.finalize()` Finalization was unreliable, introduced security risks, and negatively impacted performance. For these reasons, it was deprecated for removal in JDK 18, and both the JDK and the broader Java ecosystem have been gradually reducing and removing its use in favor of modern alternatives such as try-with-resources and the Cleaner API. See JEP 421[4] for details. This effort continues in JDK 27 as the removal of `finalize()` progresses. `ThreadPoolExecutor` is a non-final implementation of `ExecutorService` that may serve as a superclass for executor services in frameworks, libraries, and applications. Its `finalize` method was deprecated in JDK 9, re-specified to do nothing (thus left empty) in JDK 11, and deprecated for removal as part of JEP 421 in JDK 18. Now, JDK 27 is removing the empty method[5], which can lead to compile errors in existing code. While `Object.finalize()` declares that it `throws Throwable`, `ThreadPoolExecutor.finalize()` does not. This means that calls to `ThreadPoolExecutor.finalize()`, either directly or by an extending class through `super.finalize()`, will now implicitly call `Object.finalize()` and these calls may encounter a `Throwable` where they did not before, which is likely to result in a compile-time error. Projects encountering this situation are strongly encouraged to remove this (and any other) use of `finalize()`. If absolutely necessary, a workaround would be to enclose the invocation of `finalize()` in a `try` block. Since this ultimately calls `Object.finalize()`, which is empty, the `catch` block can likewise be empty. For more details, please check this article[6]. [4] https://openjdk.org/jeps/421 [5] https://bugs.openjdk.org/browse/JDK-8371856 [6] https://inside.java/2026/02/10/quality-heads-up/ # JDK 27 The JDK 27 early-access builds 8 are now available[7]. You can review the release notes here[8]. So far, one JEP (JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3) has been targeted for this release. ## Changes in recent JDK 27 builds that may be of interest: - JDK-8347938: Add Support for the Latest ML-KEM & ML-DSA Private Key Encodings - JDK-8373018: Update OpenSSL version to 3.5.4 - JDK-8210336: DateTimeFormatter predefined formatters should support short TZ offsets - JDK-8369736: Add management interface for AOT cache creation - JDK-8369282: Distrust TLS server certificates anchored by Chunghwa ePKI RootCA - JDK-8328046: Need to keep leading zeros in TlsPremasterSecret of TLS1.3 DHKeyAgreement - JDK-8355522: Remove the `java.locale.useOldISOCodes` system property - JDK-8373476: (tz) Update Timezone Data to 2025c - JDK-8369564: Provide a MemorySegment API to read strings with known lengths - JDK-8373068: Revisit details of Float16 to decimal conversion algorithm - JDK-8373710: Improve jpackage error reporting - JDK-8341272: Factory to create wide iinc instruction with small arguments - JDK-8371748: Remove the (empty) ThreadPoolExecutor.finalize() method - JDK-8373867: Improve robustness of Attach API for finding tmp directory - JDK-8373208: Make Atomic class template constant initializable - JDK-8375063: Update Libpng to 1.6.54 Note: A more comprehensive list of changes can be found here[9]. [7] https://jdk.java.net/27/ [8] https://jdk.java.net/27/release-notes [9] https://github.com/openjdk/jdk/compare/jdk-27+1...jdk-27+8 # JavaFX 27 Early-Access Builds These are early-access builds of the JavaFX 27 Runtime, built from openjdk/jfx. They allow JavaFX application developers to build and test their applications with JavaFX 27 on JDK 27. Although these builds are designed to work with JDK 27-ea, they are also known to work with JDK 25 and later versions. The latest early-access builds of JavaFX 27 are now available [10], along with the corresponding JavaFX 27 API Javadocs [11]. [10] https://jdk.java.net/javafx27/ [11] https://download.java.net/java/early_access/javafx27/docs/api/ # Topics of Interest - Optimizing Java Class Metadata in Project Valhalla https://joelsiks.com/posts/valhalla-inlinelayoutinfo-array-optimization/ - LazyConstants in JDK 26 https://inside.java/2026/02/05/newscast-106/ - Data-Oriented Programming for Java: Beyond Records https://openjdk.org/projects/amber/design-notes/beyond-records - Carrier Classes; Beyond Records https://inside.java/2026/01/22/newscast-105/ - One Giant Leap: 95% Less Sampling Cost https://norlinder.nu/posts/User-CPU-Time-JVM/ - The Static Dynamic JVM – A Many Layered Dive #JVMLS https://inside.java/2026/01/11/jvmls-static-dynamic-jvm/ - Java's Plans for 2026 https://inside.java/2026/01/08/newscast-104/ - “Predictability or Innovation? Both!” with Georges Saab https://inside.java/2025/12/26/podcast-043/ - Java's 2025 in Review https://inside.java/2025/12/18/newscast-103/ ~ I’d like to thank everyone who has already provided feedback on the JDK 26 builds. Your input is incredibly valuable, especially when received early in the development cycle. P.S. I hope to see some of you at JavaOne! P.P.S. Please let me know if you don't want to receive these OpenJDK Quality Outreach updates anymore.
