Every change between JDK 11 and the Java 17 LTS release

If you were to look at the features in Java 17, the most recent long-term support (LTS) release from Oracle, you’d probably be disappointed. There’s only 14 JDK enhancement proposals (JEP) included in the release, and none of them are particularly exciting. In fact, some of the JEPs are downright depressing, such as the deprecation of the Applet API for removal or the removal of the experimental AOT and JIT compilers.

There are no ‘big bang’ JDK releases anymore. In the past, there would be a highly anticipated feature such as Java modules or Lambda expressions that would delay a release until the feature was complete. The Java world doesn’t work like that anymore. Releases now happen every six months. If a feature is complete, it goes into the release. If not, it gets targeted to the next release. But a new release happens every six months, and feature enhancements happen incrementally over time. So if you want to know what’s new in the latest LTS release, you really need to look over the various changes that were made and enhancements that were added between Java 11 and 17. Starting with Java 12, here is a list of them:

Java 12 enhancements

Released in March of 2019, the big addition to the JDK in Java 12 was the Shenandoah, low-pause-time garbage collector designed to improve performance and reduce stop-the-world events at runtime.

  • 189: The experimental Shenandoah garbage collector
  • 230: Microbenchmark suite
  • 325: Preview for Switch statement expressions
  • 334: Constants API for the JVM
  • 340: Single AArch64 port instead of two
  • 341: CDS archive defaults
  • 344: Mixed collections for G1 that are abortable
  • 346: Fast return of G1’s unused committed memory

Java 13 JEPs

Java 13 only included 5 enhancements, although the text blocks preview was widely anticipated and extensively discussed in the community. It’s a feature that is quite simple on the surface, but creates untold problems with its implementation.

  • 350: Dynamic CDS archives
  • 351: ZGC: Uncommit unused garbage collector memory
  • 353: Reimplementation of the Legacy Socket API
  • 354: Update to the switch expressions preview
  • 355: A preview of Java text blocks
JDK 17 LTS

There are many reasons why the JDK 17 LTS release should generate excitement in the Java community.

Java 14 improvements

Java 14 was noteworthy for it’s preview introduction of Records as a new Java type. The last time a new Java type was introduced into the language was the Enum in Java 5.

Event streaming to provide real time monitoring with the Java Flight Recorder, along with ZGC enhancements to improve garbage collection are other noteworthy enhancements included in this release.

  • 305: instanceof pattern matching preview
  • 343: Incubator for the new packaging tool
  • 345: NUMA awareness for the G1 garbage collector
  • 349: Java Flight Recorder event streaming for Java Mission Control
  • 352: Non-Volatile mapped byte buffers
  • 358: Helpful NullPointerException guidance
  • 359: A preview of the new Java data type named Records
  • 361: Standard inclusion for switch expressions
  • 362: Deprecation of Solaris SPARC Ports
  • 363: Removal of Java’s Concurrent Mark Sweep (CMS) garbage collector
  • 364: ZGC for macOS garbage collection and memory management
  • 365: ZGC for Windows garbage collection and memory management
  • 366: Deprecation of the combination of the SerialOld  and ParallelScavenge  GC algorithms
  • 367: Removal of Pack200 Tools
  • 368: A second preview of Java Text Blocks feature
  • 370: Incubator for the Foreign-Memory Access API

Java 15 release features

Java 15 officially included the Java text blocks feature, while improvements continued to be made to the ZGC and Shenandoah garbage collectors. Here are the various features added in JDK 15:

339: Addition of EdDSA (Edwards-Curve Digital Signature Algorithm)
360: Preview for sealed classes
371: Addition of hidden classes in Java
372: Removal of the Nashorn JavaScript Engine
373: Legacy DatagramSocket API reimplementation
374: Biased locking disablement and deprecation
375: Second preview for instanceof pattern matching
377: Addition of ZGC, the scalable, low-latency, garbage collector for Java
378: Full inclusion of Java Text Blocks
379: Addition and enhancements of the low-pause time Shenandoah garbage collector
381: Final remove of Solaris and SPARC Ports
383: Incubation of the Foreign-Memory Access API
384: Second preview inclusion of Java Records
385: RMI Activation deprecation with the goal of future removal

Java 16 release features

Java 16 was the GitHub release, where the move was made to host the OpenJDK Community’s Git repositories on GitHub.

  • 338: Incubation of the Vector API
  • 347: C++14 language features enablement
  • 357: Migration from Mercurial to Git
  • 369: GitHub migration of OpenJDK repositories
  • 376: Concurrent thread-stack processing for ZGC
  • 380: Unix-Domain Socket Channels
  • 386: Alpine Linux port
  • 387: Support for elastic metaspace
  • 388: The Windows AArch64 Port
  • 389: Incubation of the Foreign Linker API
  • 390: Value-based classes warnings
  • 392: Addition of the Packaging Tool
  • 393: Third incubation of the Foreign-Memory Access API
  • 394: Full inclusion of pattern matching for instanceof
  • 395: Full implementation of Java Records
  • 396: String encapsulation of JDK Internals
  • 397: Second preview of sealed classes

Java 17 LTS release features

And finally, here are the enhancements made to the latest, Java LTS release:

  • 306: Restoration of always-strict semantics for floating-points
  • 356: Pseudo-random number generators improvements
  • 382: Support for a new macOS pipeline for rendering
  • 391: The macOS AArch64 port
  • 398: Deprecation of the infamous Applet API with the goal of full removal
  • 403: Strong encapsulation of Java’s internals
  • 406: Switch pattern matching preview
  • 407: RMI Activation removal
  • 409: Full support for sealed Java classes
  • 410: Removal of the experimental and largely unused ahead-of-time (AOT) and just-in-time (JIT) compilers
  • 411: Deprecation of the Security Manager with removal being the eventual goal
  • 412: Incubation of the Foreign Function & Memory API
  • 414: Second incubation of the Vector API
  • 415: Context-specific deserialization filters

As you can see, the Java 17 release itself is somewhat underwhelming in terms of features. But when you look at the aggregation of all of the incremental updates between Java 11 and Java 17 LTS releases, you see an impressive set of improvements to performance, syntax, APIs and community support.

If you get a chance, download and install Java 17 and check out all the new features this new LTS release provides. You’ll be impressed by how much Java has matured since the 2018 release of Java 11.