
Java 27 landed on September 15, 2026. It is not an LTS release — that distinction belongs to Java 25. But dismissing it as a mere stepping-stone release misses what actually changed. This is the release where Oracle stopped asking Java developers to opt into sensible defaults and simply turned them on. Three production-ready JEPs require zero code modifications: post-quantum TLS is now active, G1 GC is the universal default, and compact object headers shrink every heap automatically. Your app benefits the moment you upgrade the JDK.
Post-Quantum TLS Is Now the Default (JEP 527)
The threat driving JEP 527 is “harvest now, decrypt later.” Adversaries collect encrypted TLS traffic today, betting that future quantum computers will let them crack it retroactively. Java 27 responds with hybrid key exchange for TLS 1.3, combining classical ECDHE with ML-KEM-768 — the NIST-standardized algorithm (FIPS 203, formerly Kyber) built to survive quantum attacks.
In practice, TLS clients now send two key shares per handshake: one using X25519MLKEM768 (the hybrid scheme) and one using classical x25519. If the server supports the hybrid scheme, quantum protection is active. If it does not, the classical share handles it and nothing breaks. Applications using javax.net.ssl get this automatically — no API changes, no config flags, no migration work required. Most other languages and runtimes still require you to explicitly request post-quantum cryptography. Java 27 turns it on by default.
G1 GC Is Now Default Everywhere — Including Your Containers (JEP 523)
There is a problem that has been quietly hitting container deployments for years: if the JVM detected fewer than two CPUs or less than 1,792 MB of RAM at startup, it silently selected Serial GC. Serial is a single-threaded, stop-the-world collector designed for tiny heaps in the early 2000s. Any Kubernetes pod or Docker container running with limited resources — without an explicit -XX:+UseG1GC flag — was likely on Serial GC without the team knowing.
JDK 27 ends this. JEP 523 makes G1 the default in all environments. Recent G1 improvements brought its native memory overhead and throughput to parity with Serial, removing the original justification for the fallback. Serial GC is not removed — -XX:+UseSerialGC still works — but no application should inherit it by accident anymore.
Compact Object Headers Cut Heap Usage Up to 22% (JEP 534)
Java object headers have always carried more overhead than necessary. On 64-bit HotSpot, each object header occupied 12 bytes (96 bits). JDK 27 makes compact headers the default, trimming that to 8 bytes (64 bits). These were finalized in JDK 25 but required an opt-in flag — -XX:+UseCompactObjectHeaders — until now.
The production numbers are hard to dismiss. Amazon measured 8–11% higher throughput across hundreds of services. A SPECjbb2015 benchmark found 22% less heap usage, 8% less CPU time, and 15% fewer garbage collections. The mechanism is straightforward: smaller objects mean more fit in CPU cache, reducing cache misses and improving throughput. For services holding millions of live objects — caches, JPA entity grids, data pipelines — this is real infrastructure cost cut without touching a line of application code.
JFR Stops Writing Your Secrets to Disk (JEP 536)
JDK Flight Recorder has a quiet data leakage problem that has existed for years: recordings captured jdk.InitialEnvironmentVariable and jdk.InitialSystemProperty events, which could include JDBC passwords, API keys, and cloud credentials. Any .jfr file sent to a vendor or attached to a support ticket was a potential secret exposure.
JDK 27 redacts sensitive values before they are written to the recording. Command-line arguments, initial environment variables, and system properties are filtered by default. Teams can extend coverage with application-specific keys:
java -XX:FlightRecorderOptions:redact-key=+STRIPE_SECRET,+DB_PASS -jar app.jar
This is the type of secure-by-default change that prevents incidents rather than responding to them.
Preview Features Worth Tracking
Two preview features are converging toward final status. Lazy Constants (JEP 531, third preview) lets developers define values that initialize on first use while the JVM treats them as fold targets — the same optimization opportunity as final fields, without rigid initialization timing. Primitive types in patterns (JEP 532, fifth preview) extends switch and instanceof to work with long, float, double, and other primitives with exact conversion checks. Neither is production-ready, but the fifth preview iteration on JEP 532 is a strong signal that finalization is close.
Should You Upgrade to Java 27?
Java 27 is a non-LTS release, supported only until March 2027 when JDK 28 ships. The next LTS is Java 29, scheduled for September 2027. The practical recommendation for most teams: run Java 27 in CI and performance environments now, keep production on Java 25. The defaults improvements in JDK 27 — post-quantum TLS, G1 everywhere, compact headers — are expected to flow into Java 25 via the October 2026 Critical Patch Update. Check the Oracle Java SE Support Roadmap for exact backport timing.
If your team is still on Java 21 and skipped Java 25, the JDK 27 release notes are a useful catalog of what you have been leaving on the table. Java 27 is not chasing headlines with new syntax. It is making the language safer, leaner, and more honest about its defaults — which is exactly the kind of progress that compounds quietly across every deployment in your fleet.













