Do you know which version of Java is currently good to be used in production? Are you are aware that not all releases are supported in a long run? This post is a living document that will keep you updated on the recent Java releases, JDK providers and the level of support you can expect.

Making the right choice is not easy. I have broken it down for you by focusing on a few key areas. Here they are

Would you approach this differently? Have I missed anything? Great. Please share your feedback in the comment section below.

Release Cycle and Long-Term Support

Java 9 brought not only groundbreaking changes to the platform, but it also observed a new era of faster release iterations.

Java 11 is the first version supported by many JDK providers in a long run. Time is slowly but surely running out, some providers cease active maintenance of Java 11 in September 2022.

Java 17 is the next version that will enjoy long-term support. Its release is less than a month away.

See this section for a detailed overview of all Java versions since the beginning of time.

Most Widely Adopted Java Versions

The short answer is Java 8 and Java 11. While in 2020 Java 8 clearly dominated, in 2021 we have seen a gradual shift to Java 11 and even to newer versions.

To get an idea of the actual adoption rates I have used two different surveys conducted by JRebel and Snyk. Both of the surveys show that more that more than a single Java version is used in production.

The former (JRebel) incorporates input of some 900 developers during Q3 of 2020 and confirms Java 8’s dominance with some 69% worth of share, compared to 39% of Java 11’s adoption ratio.

The more recent survey conducted in Q1 of 2021 on a developer base twice as large confirms a shift to Java 11 with a potential of faster adoption of newer Java versions.

Over 60% of developers use Java SE 11 in production.

(Q1 2021)

Source: Snyk
Java 11 adoption rate has increased according to a developer survey conducted in Q1 2021. Source: Snyk

In the years to come we are likely to see a faster transition to newer versions of Java SE. The shorter release cycle has already been reflected by tools and frameworks. Spring 5.3, for example, will support a range of Java generations.

Spring 5.3 aims at Java 8, 11 and 17, as well as preview features of new Java versions!

Most Popular JDK Providers

Since Java 9 came about we have definitely seen a shift from Oracle to other vendors and OpenJDK has seen a steady increase in adoption. Based on the survey conducted by Snyk the most used JDK providers (ordered by popularity) are AdoptOpenJDK, Oracle JDK, Oracle OpenJDK and Azul Zulu. All of them meet Java specification standard, since they all pass Technology Compatibility Kit (TCK).

Most popular JDK providers in Q1 2021. Source: Snyk
ProviderFree Builds from SourceFree Binary DistributionsExtended UpdatesCommercial Support
AdoptOpenJDKYesYesYesYes
Oracle OpenJDKYesYesYesYes
Oracle JDKNoYesYesYes
Azul ZuluNoYesYesYes
A quick comparison of JDK providers.

AdoptOpenJDK

website: https://adoptopenjdk.net

  • Free binary distributions:
    • OpenJDK 8 (LTS), 11 (LTS), 16 (latest)
    • HotSpot
    • OpenJ9
  • Build your own JDK from sources
  • LTS release of Java 8 to at least May 2026
  • LTS release of Java 11 to at least October 2024
  • Java 16 supported until September 2021
  • LTS release of Java 17 since September 2021. End of support is TBD
  • Support details

Oracle OpenJDK

website: https://openjdk.java.net

  • Free binary distributions available, latest ones are JDK 16 and early access of JDK 17
  • Build your own JDK from sources
  • support terms and conditions vary per provider (Oracle, Azul, RedHat etc.)

Oracle JDK

website: https://www.oracle.com/java/technologies/javase-downloads.html

  • Free binary distributions are available, but limitations apply
  • LTS release of Java 8:
    • free support no longer available
    • paid support until March 2022, eventually up to December 2030
  • LTS release of Java 11 – paid support until September 2023, eventually up to September 2026
  • Java 16 supported until September 2021
  • Support details

Azul Zulu

website:  https://www.azul.com

  • Free binary distributions: Zulu OpenJDK
  • commercial distribution with improved performance: Zing
  • commercial support of Java 8 and other legacy releases
  • LTS much longer than Oracle’s, see their roadmap for direct comparison

Java Versions and New Features

Java VersionRelease Date
Java SE 17 (LTS)14 September 2021
Java SE 1616 March 2021
Java SE 1515 September 2020
Java SE 1417 March 2020
Java SE 1317 September 2019
Java SE 1219 March 2019
Java SE 11 (LTS)25 September 2018
Java SE 10 20 March 2018
Java SE 9 21 September 2017
Java SE 8 (Spider)18 March 2014
Java SE 7 (Dolphin)28 July 2011
Java SE 6 (Mustang)11 December 2006
J2SE 5.0 (Tiger)30 September 2004
J2SE 1.4 (Merlin)06 February 2002
J2SE 1.3 (Kestrel)08 May 2000
J2SE 1.2 (Playground)08 December 1998
JDK 1.119 February 1997
JDK 1.023 January 1996

Java SE 17

Planned release date: 14 September 2021

The upcoming 17th version is the first release after Java 11 which will enjoy long-term support.

Highlight: Sealed classes help the case of pattern matching.

public abstract sealed class Shape
    permits Circle, Rectangle, Square { ... }

Source: JEP 409 – Sealed Classes

Overview of some of the added features:

  • JEP 356: Enhanced Pseudo-Random Number Generators
  • JEP 398: Deprecate the Applet API for Removal
  • JEP 403: Strongly Encapsulate JDK Internals
  • JEP 406: Pattern Matching for switch (Preview)
  • JEP 407: Remove RMI Activation
  • JEP 409: Sealed Classes
  • JEP 411: Deprecate the Security Manager for Removal
  • JEP 415: Context-Specific Deserialization Filters

Java SE 16

Release date: 16 March 2021

Highlight: Need a plain data container? Use a Record class.

record Point(int x, int y) { }

Source: JSR 395 – Records

Overview of some of the added features:

  • JEP 394: Pattern Matching for instanceof
  • JEP 395: Records
  • JEP 397: Sealed Classes (Second Preview)
  • JEP 396: Strongly Encapsulate JDK Internals by Default
  • JEP 380: Unix-Domain Socket Channels
  • JEP 390: Warnings for Value-Based Classes

Java SE 15

Release date: 15 September 2020

This release completes some of the new language features from the previous release and adds a new scheme for digital signatures.

Highlight: Shenandoah, a low-pause-time GC is no longer experimental.

-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

Overview of some of the added features::

  • JEP 385: Deprecate RMI Activation for Removal
  • JEP 371: Hidden Classes
  • JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)
  • JEP 375: Pattern Matching for instanceof (Second Preview)
  • JEP 384: Records (Second Preview)
  • JEP 360: Sealed Classes (Preview)
  • JEP 378: Text Blocks
  • JEP 379: Shenandoah, a Low-Pause-Time Garbage Collector

Java SE 14

Release date: 17 March 2020

This release started a quest for a more concise syntax in Java and better expressiveness by introducing the concept of pattern matching, data classes (called Records), sealed classes and the possibility to use switch as an expression. It also (finally!!) adds support for multi-line string literals.

Highlight: switch as as an expression ..

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

Source: JEP 361 – Switch Expressions

Overview of some of the added features:

  • JEP 305: Pattern Matching for instanceof (Preview)
  • JEP 359: Records (Preview)
  • JEP 361: Switch Expressions
  • JEP 368: Text Blocks (Second Preview)
  • JEP 367: Remove the Pack200 Tools and API

Java SE 13

Release date: 17 September 2019

There aren’t many changes in this release, but it builds a foundation for future improvements.

Highlight: Text blocks aka multi-line string literals.

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

Source: JEP 355 – Text Blocks

Overview of some of the added features:

  • JEP 351: Uncommit Unused Memory (Experimental)
  • JEP 354: Switch Expressions (Preview)
  • JEP 355: Text Blocks (Preview)

Java SE 12

Release date: 19 March 2019

Highlight: Shenandoah, an asynchronous garbage collector that does not require a full GC cycle.

java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

Overview of some of the added features:

  • JEP 189: Shenandoah, a Low-Pause-Time Garbage Collector (Experimental)
  • JEP 334: JVM Constants API
  • JEP 325: Switch Expressions (Preview)

Java SE 11

Release date: 25 September 2018

Highlight: No need to (explicitly) compile source files.

$ java HelloWorld.java

Hello world!

java HelloWorld.java

is formally equivalent to:

javac -d <directory> HelloWorld.java
java -cp <directory> hello.World

Source: JEP 330 – Launch Single-File Source-Code Programs

Overview of some of the added features:

  • JEP 181: Nest-Based Access Control
  • JEP 309: Dynamic Class-File Constants
  • JEP 320: Remove the Java EE and CORBA Modules
  • JEP 321: HTTP Client
  • JEP 323: Local-Variable Syntax for Lambda Parameters
  • JEP 324: Key Agreement with Curve25519 and Curve448
  • JEP 327: Unicode 10
  • JEP 329: ChaCha20 and Poly1305 Cryptographic Algorithms
  • JEP 330: Launch Single-File Source-Code Programs
  • JEP 332: Transport Layer Security (TLS) 1.3
  • JEP 336: Deprecate the Pack200 API

Java SE 10

Release date: 20 March 2018

Highlight: Compiler infers data type with local variables.

var greeting = “Hello world!” // String greeting = ..

Overview of some of the added features:

  • JEP 314: Additional Unicode Language-Tag Extensions
  • JEP 322: Time-Based Release Versioning
  • JEP 286: Local-Variable Type Inference

Java SE 9

Release date: 21 September 2017

Java 9 introduced a major overhaul – modularization. One of the benefits is a smaller memory footprint. Applications can declare which modules does it require and JVM will only load these.

Highlight: Modularization – project Jigsaw

Overview of some of the added features:

  • JEP 102: Process API Updates
  • JEP 193: Variable Handles
  • JEP 211: Elide Deprecation Warnings on Import Statements
  • JEP 213: Milling Project Coin
  • JEP 219: Datagram Transport Layer Security (DTLS)
  • JEP 223: New Version-String Scheme
  • JEP 226: UTF-8 Property Resource Bundles
  • JEP 229: Create PKCS12 Keystores by Default
  • JEP 238: Multi-Release JAR Files
  • JEP 244: TLS Application-Layer Protocol Negotiation Extension
  • JEP 249: OCSP Stapling for TLS
  • JEP 251: Multi-Resolution Images
  • JEP 252: Use CLDR Locale Data by Default
  • JEP 259: Stack-Walking API
  • JEP 261: Module System
  • JEP 262: TIFF Image I/O
  • JEP 264: Platform Logging API and Service
  • JEP 266: More Concurrency Updates
  • JEP 267: Unicode 8.0
  • JEP 268: XML Catalogs
  • JEP 269: Convenience Factory Methods for Collections
  • JEP 272: Platform-Specific Desktop Features
  • JEP 273: DRBG-Based SecureRandom Implementations
  • JEP 274: Enhanced Method Handles
  • JEP 277: Enhanced Deprecation
  • JEP 280: Indify String Concatenation
  • JEP 285: Spin-Wait Hints
  • JEP 289: Deprecate the Applet API
  • JEP 290: Filter Incoming Serialization Data

Java SE 8 aka Spider

Release date: 18 March 2014

Java 8 is remembered for lambda expressions, method references, Optional and other exciting new language features.

Highlight: Lambda expressions (closures) and functional interfaces.

Runnable r1 = () -> System.out.println(“Hello world!”);

Overview of some of the added features:

  • JEP 101: Generalized Target-Type Inference
  • JEP 103: Parallel Array Sorting
  • JEP 104: Annotations on Java Types
  • JEP 106: Add Javadoc to javax.tools
  • JEP 107: Base64 Encoding & Decoding
  • JEP 109: Enhance Core Libraries with Lambda
  • JEP 114: TLS Server Name Indication (SNI) Extension
  • JEP 118: Access to Parameter Names at Runtime
  • JEP 120: Repeating Annotations
  • JEP 123: Configurable Secure Random-Number Generation
  • JEP 124: Enhance the Certificate Revocation-Checking API
  • JEP 126: Lambda Expressions & Virtual Extension Methods
  • JEP 128: BCP 47 Locale Matching
  • JEP 129: NSA Suite B Cryptographic Algorithms
  • JEP 133: Unicode 6.2
  • JEP 140: Limited doPrivileged
  • JEP 150: Date & Time API
  • JEP 155: Concurrency Updates
  • JEP 161: Compact Profiles
  • JEP 162: Prepare for Modularization
  • JEP 170: JDBC 4.2
  • JEP 178: Statically-Linked JNI Libraries
  • JEP 184: HTTP URL Permissions
  • JEP 185: Restrict Fetching of External XML Resources

Java SE 7 aka Dolphin

Release date: 28 July 2011

Java 7 introduced several new enhancements that contributed a lot to a better productivity. Try-with-resources in tandem with AutoCloseable are arguably the most profound improvements.

Highlight: Try-with-resources.

try(

FileInputStream in = new FileInputStream(“example.txt”);

FileOutputStream out = new FileOutputStream(“out.txt”)

)

Overview of some of the added features:

  • JSR 292: Support for dynamically-typed languages (InvokeDynamic)
  • JSR 202: Strict class-file checking
  • JSR 334: Small language enhancements (Project Coin)
  • JSR 166: Concurrency and collections updates
  • JSR 203: More new I/O APIs for the Java platform (NIO.2)
  • JSR 224: Update the XML stack

Java SE 6 aka Mustang

Release date: 11 December 2006

Java 6 made instrumentation more easily accessible and flexible. This gave rise to adoption of aspect oriented programming (AOP) and monitoring tools in general.

Highlight: “premain” method to load a custom Java agent.

Source: stackoverflow
import java.lang.instrument.Instrumentation;

final public class Sizeof {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long sizeof(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

Overview of some of the added features:

  • JSR 202: Java Class-File Specification Update
  • JSR 105: XML Digital-Signature APIs
  • JSR 199: Java Compiler API
  • JSR 269: Pluggable Annotation-Processing API
  • JSR 221: JDBC 4.0
  • JSR 173: Streaming API for XML (StAX)
  • JSR 181: Web-Services Metadata
  • JSR 222: Java Architecture for XML Binding (JAXB) 2.0
  • JSR 224: Java API for XML-Based Web Services (JAX-WS) 2.0
  • JSR 223: Scripting for the Java Platform
  • JSR 250: Common Annotations
  • JavaBeans Activation Framework (JAF) 1.1

J2SE 5.0 aka Tiger

Release date: 30 September 2004

Java 5 brought new language features that contributed to a higher productivity: enhanced for-loop, varargs and a big one – generics.

Highlight: Generics as a way to an increased safety at compile time.

List<String> strings = new ArrayList<String>();

strings.add(“abc”);

String abc = strings.get(0); // no need to cast

Overview of some of the added features:

J2SE 1.4 aka Merlin

Release date: 6 February 2002

Java 1.4 introduced assertions, regular expressions, enhanced logging API and other useful features.

Overview of some of the added features:

  • JSR 63: XML Processing
  • JSR 6: Java Print Service API
  • JSR 47: Logging API
  • Java Web Start
  • JDBC 3.0 API
  • Assertions
  • Preferences API
  • Chained Exception
  • IPv6 Support
  • Regular Expressions
  • Image I/O API

J2SE 1.3 aka Kestrel

Release date: 8 May 2000

Overview of some of the added features:

  • Java Sound
  • Jar Indexing

J2SE 1.2 aka Playground

Release date: 8 December 1998

Overview of some of the added features:

  • Collections framework.
  • Java String memory map for constants.
  • Just In Time (JIT) compiler.
  • Jar Signer for signing Java ARchive (JAR) files.
  • Policy Tool for granting access to system resources.
  • Java Foundation Classes (JFC) which consists of Swing 1.0, Drag and Drop, and Java 2D class libraries.
  • Java Plug-in
  • Scrollable result sets, BLOB, CLOB, batch update, user-defined types in JDBC.
  • Audio support in Applets.

JDK 1.1

Release date: 19 February 1997

  • JDBC (Java Database Connectivity)
  • Inner Classes
  • Java Beans
  • RMI (Remote Method Invocation)
  • Reflection (introspection only)

JDK 1.0

Release date: 23 January 1996

Categories: Java

Tomas Zezula

Hello! I'm a technology enthusiast with a knack for solving problems and a passion for making complex concepts accessible. My journey spans across software development, project management, and technical writing. I specialise in transforming rough sketches of ideas to fully launched products, all the while breaking down complex processes into understandable language. I believe a well-designed software development process is key to driving business growth. My focus as a leader and technical writer aims to bridge the tech-business divide, ensuring that intricate concepts are available and understandable to all. As a consultant, I'm eager to bring my versatile skills and extensive experience to help businesses navigate their software integration needs. Whether you're seeking bespoke software solutions, well-coordinated product launches, or easily digestible tech content, I'm here to make it happen. Ready to turn your vision into reality? Let's connect and explore the possibilities together.