Part 1 of 16

Java 11 Overview: The Road from Java 8 Through Java 9, 10, to LTS

Why Java 11 Matters

Java 8 was released in March 2014. It dominated enterprise Java for nearly a decade, but it misses a decade’s worth of language improvements, API modernisation, JVM advances, and security hardening. Java 11 (September 2018) is the first Long-Term Support release after Java 8, and it packages three releases of evolution into a single supported baseline.

For most teams the question is not whether to upgrade, but how. This series answers both what changed and how to adopt each feature in production code.


The 6-Month Release Cadence

Oracle changed the Java release model in 2017. Starting with Java 9, new versions ship every six months — March and September. Feature-complete releases arrive faster, but each non-LTS version receives only six months of update support.

VersionRelease DateTypeSupport Ends
Java 8March 2014LTS2030 (Temurin)
Java 9September 2017Non-LTSMarch 2018
Java 10March 2018Non-LTSSeptember 2018
Java 11September 2018LTS2026+ (Temurin/Corretto)
Java 17September 2021LTS2029+
Java 21September 2023LTS2031+

LTS (Long-Term Support) means the OpenJDK project and distributions like Eclipse Temurin and Amazon Corretto commit to security and stability patches for multiple years — typically eight or more. For enterprise applications that cannot upgrade frequently, LTS is the only viable target.

Java 11 is the LTS release directly after Java 8. Teams upgrading today either land on Java 11 as a stepping stone, or leapfrog to Java 17 or 21. Either way, understanding Java 11 is essential because Java 11 introduced the Module System, removed Java EE APIs, and changed GC defaults — all of which affect every migration path.


What LTS Means in Practice

  • Security patches: JVM and library vulnerabilities are fixed throughout the support window.
  • No new features: Stability is prioritised; behaviour changes are minimal.
  • Vendor commitments: Amazon Corretto, Eclipse Temurin, Azul Zulu, Microsoft Build all commit to Java 11 builds through at least 2026.
  • Certification window: ISV software certifications last years — LTS aligns your runtime with your vendor’s support.

Java 9: The Big One (September 2017)

Java 9 was the most disruptive release in Java’s history. It delivered 22 significant JEPs, the largest single-release feature set since Java 5.

Core Language and JVM

JEPFeatureWhat It Does
261Module System (Project Jigsaw)Modularises the JDK; adds module-info.java
213Milling Project CoinPrivate interface methods, diamond with anon classes
259Stack-Walking APIEfficient programmatic stack frame access
280Indify String ConcatenationInvokeDynamic-based concatenation (faster)
254Compact StringsSingle-byte internal storage for Latin-1 strings

APIs

JEPFeatureWhat It Does
269Collection Factory MethodsList.of(), Set.of(), Map.of()
266More Concurrency UpdatesCompletableFuture additions, reactive streams (Flow)
110HTTP/2 Client (Preview)Modern HTTP client; standardised in Java 11
251Multi-Resolution ImagesMulti-resolution image API
268XML CatalogsOASIS XML Catalog 1.1 support

JVM and GC

JEPFeatureWhat It Does
248G1 as Default GCG1GC replaces Parallel GC as default
271Unified GC Logging-Xlog:gc* replaces -XX:+PrintGCDetails
264Platform Logging APIInternal JDK logging via java.util.logging
285Spin-Wait HintsThread.onSpinWait() for HotSpot optimisation

Tooling

JEPFeatureWhat It Does
222JShell (REPL)Interactive Java shell
282jlinkCustom minimal runtime images
224HTML5 JavadocHTML5 Javadoc output
225Javadoc SearchSearch box in generated Javadoc

Security

JEPFeatureWhat It Does
273DRBG-Based SecureRandomDeterministic random bit generator
287SHA-3 AlgorithmsSHA3-256, SHA3-384, SHA3-512
288Disable SHA-1 CertsBlocks weak SHA-1 SSL certificates
290Serialization FiltersJVM-wide deserialization filters

Java 10: API Polish (March 2018)

Java 10 was a shorter release but delivered the var keyword and several important JVM improvements.

JEPFeatureWhat It Does
286Local-Variable Type Inferencevar keyword for local variables
304GC InterfaceCleaner interface for pluggable GC implementations
307Parallel Full GC for G1Multi-threaded full GC (was serial)
310Application CDSShare application classes across JVM instances
312Thread-Local HandshakesStop individual threads without global safepoints
313Remove javahConsolidated into javac -h
314Unicode Language TagsEnhanced BCP 47 locale support
316Heap on NVDIMMHeap allocation on non-volatile memory
317Graal JIT (Experimental)Java-based JIT compiler on Linux/x64
319Root CertificatesOpenJDK ships with root CA certs
322Time-Based VersioningFormal $YEAR.$MONTH version scheme

Java 10 API additions (no JEP numbers, but notable):

  • Optional.orElseThrow() — no-arg version, explicit about throwing
  • List.copyOf(), Set.copyOf(), Map.copyOf() — defensive copy
  • Collectors.toUnmodifiableList/Set/Map()
  • Reader.transferTo(Writer), InputStream.transferTo(OutputStream)

Java 11: The LTS Payload (September 2018)

Java 11 standardised several incubating APIs and added the features that define modern Java.

JEPFeatureWhat It Does
181Nest-Based Access ControlPrivate access for nested classes without bridge methods
309Dynamic Class-File ConstantsCONSTANT_Dynamic for flexible bytecode constants
318Epsilon GCNo-op GC: allocates, never collects
320Remove Java EE and CORBAJAXB, JAX-WS, CORBA removed from JDK
321HTTP Client (Standard)HTTP/2 client graduated from incubator
323var in Lambda Parameters(var x, var y) -> x + y
324Curve25519/Curve448Modern elliptic curve key agreement
328Flight RecorderLow-overhead JVM profiler (open-sourced)
329ChaCha20-Poly1305Modern TLS cipher suite
330Single-File Programsjava HelloWorld.java without explicit compile
331Low-Overhead Heap ProfilingJVMTI-based heap profiling API
332TLS 1.3Full TLS 1.3 support in JSSE
333ZGC (Experimental)<1ms pause times, scalable to TB heaps
335Deprecate NashornJavaScript engine deprecated
336Deprecate Pack200Compression tool deprecated

Java 11 API additions (no JEP, but essential):

  • String.isBlank(), .lines(), .strip(), .stripLeading(), .stripTrailing(), .repeat(n)
  • Files.readString(Path), Files.writeString(Path, CharSequence)
  • Optional.isEmpty()
  • Path.of() — static factory replacing Paths.get()
  • Predicate.not(Predicate) — static negation helper

Feature Impact Matrix

Which features matter most depends on what you are building:

FeatureEnterprise AppMicroserviceCLI ToolLibrary Author
Module SystemHighMediumLowHigh
var keywordHighHighHighHigh
HTTP ClientHighHighMediumMedium
Collection factoryHighHighHighHigh
Stream enhancementsHighHighMediumHigh
JShellLowLowHighMedium
jlinkLowHighHighLow
Flight RecorderHighHighLowLow
ZGCLowHighLowLow
TLS 1.3HighHighLowLow
JPMSHighMediumLowHigh

The Migration Decision

Upgrade to Java 11 directly from Java 8?

Yes, in most cases. The key concerns:

  1. JAXB/JAX-WS usage — Check with jdeps --multi-release 11 --class-path . myapp.jar. If your app uses javax.xml.bind.*, you must add the external Jakarta JAXB dependency.
  2. Internal API access — Libraries using sun.misc.* or sun.reflect.* need updated versions. ASM 7.0+, Byte Buddy 1.9+, cglib 3.2.8+.
  3. Build tool versions — Maven 3.6.1+, Gradle 4.7+, surefire plugin 2.22.0+.
  4. JavaFX — If used, add the OpenJFX dependency separately.

Should you go straight to Java 17 or 21?

If you are starting a migration today, consider jumping to Java 17 (next LTS) or Java 21 (current LTS). Java 11 knowledge is still essential for understanding the migration path and for supporting teams on Java 11.


What’s Next

Next: Setting Up Java 11: JDK Options, Maven/Gradle, and IDE Configuration