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.

Reply via email to