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.
| Version | Release Date | Type | Support Ends |
|---|---|---|---|
| Java 8 | March 2014 | LTS | 2030 (Temurin) |
| Java 9 | September 2017 | Non-LTS | March 2018 |
| Java 10 | March 2018 | Non-LTS | September 2018 |
| Java 11 | September 2018 | LTS | 2026+ (Temurin/Corretto) |
| Java 17 | September 2021 | LTS | 2029+ |
| Java 21 | September 2023 | LTS | 2031+ |
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
| JEP | Feature | What It Does |
|---|---|---|
| 261 | Module System (Project Jigsaw) | Modularises the JDK; adds module-info.java |
| 213 | Milling Project Coin | Private interface methods, diamond with anon classes |
| 259 | Stack-Walking API | Efficient programmatic stack frame access |
| 280 | Indify String Concatenation | InvokeDynamic-based concatenation (faster) |
| 254 | Compact Strings | Single-byte internal storage for Latin-1 strings |
APIs
| JEP | Feature | What It Does |
|---|---|---|
| 269 | Collection Factory Methods | List.of(), Set.of(), Map.of() |
| 266 | More Concurrency Updates | CompletableFuture additions, reactive streams (Flow) |
| 110 | HTTP/2 Client (Preview) | Modern HTTP client; standardised in Java 11 |
| 251 | Multi-Resolution Images | Multi-resolution image API |
| 268 | XML Catalogs | OASIS XML Catalog 1.1 support |
JVM and GC
| JEP | Feature | What It Does |
|---|---|---|
| 248 | G1 as Default GC | G1GC replaces Parallel GC as default |
| 271 | Unified GC Logging | -Xlog:gc* replaces -XX:+PrintGCDetails |
| 264 | Platform Logging API | Internal JDK logging via java.util.logging |
| 285 | Spin-Wait Hints | Thread.onSpinWait() for HotSpot optimisation |
Tooling
| JEP | Feature | What It Does |
|---|---|---|
| 222 | JShell (REPL) | Interactive Java shell |
| 282 | jlink | Custom minimal runtime images |
| 224 | HTML5 Javadoc | HTML5 Javadoc output |
| 225 | Javadoc Search | Search box in generated Javadoc |
Security
| JEP | Feature | What It Does |
|---|---|---|
| 273 | DRBG-Based SecureRandom | Deterministic random bit generator |
| 287 | SHA-3 Algorithms | SHA3-256, SHA3-384, SHA3-512 |
| 288 | Disable SHA-1 Certs | Blocks weak SHA-1 SSL certificates |
| 290 | Serialization Filters | JVM-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.
| JEP | Feature | What It Does |
|---|---|---|
| 286 | Local-Variable Type Inference | var keyword for local variables |
| 304 | GC Interface | Cleaner interface for pluggable GC implementations |
| 307 | Parallel Full GC for G1 | Multi-threaded full GC (was serial) |
| 310 | Application CDS | Share application classes across JVM instances |
| 312 | Thread-Local Handshakes | Stop individual threads without global safepoints |
| 313 | Remove javah | Consolidated into javac -h |
| 314 | Unicode Language Tags | Enhanced BCP 47 locale support |
| 316 | Heap on NVDIMM | Heap allocation on non-volatile memory |
| 317 | Graal JIT (Experimental) | Java-based JIT compiler on Linux/x64 |
| 319 | Root Certificates | OpenJDK ships with root CA certs |
| 322 | Time-Based Versioning | Formal $YEAR.$MONTH version scheme |
Java 10 API additions (no JEP numbers, but notable):
Optional.orElseThrow()— no-arg version, explicit about throwingList.copyOf(),Set.copyOf(),Map.copyOf()— defensive copyCollectors.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.
| JEP | Feature | What It Does |
|---|---|---|
| 181 | Nest-Based Access Control | Private access for nested classes without bridge methods |
| 309 | Dynamic Class-File Constants | CONSTANT_Dynamic for flexible bytecode constants |
| 318 | Epsilon GC | No-op GC: allocates, never collects |
| 320 | Remove Java EE and CORBA | JAXB, JAX-WS, CORBA removed from JDK |
| 321 | HTTP Client (Standard) | HTTP/2 client graduated from incubator |
| 323 | var in Lambda Parameters | (var x, var y) -> x + y |
| 324 | Curve25519/Curve448 | Modern elliptic curve key agreement |
| 328 | Flight Recorder | Low-overhead JVM profiler (open-sourced) |
| 329 | ChaCha20-Poly1305 | Modern TLS cipher suite |
| 330 | Single-File Programs | java HelloWorld.java without explicit compile |
| 331 | Low-Overhead Heap Profiling | JVMTI-based heap profiling API |
| 332 | TLS 1.3 | Full TLS 1.3 support in JSSE |
| 333 | ZGC (Experimental) | <1ms pause times, scalable to TB heaps |
| 335 | Deprecate Nashorn | JavaScript engine deprecated |
| 336 | Deprecate Pack200 | Compression 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 replacingPaths.get()Predicate.not(Predicate)— static negation helper
Feature Impact Matrix
Which features matter most depends on what you are building:
| Feature | Enterprise App | Microservice | CLI Tool | Library Author |
|---|---|---|---|---|
| Module System | High | Medium | Low | High |
| var keyword | High | High | High | High |
| HTTP Client | High | High | Medium | Medium |
| Collection factory | High | High | High | High |
| Stream enhancements | High | High | Medium | High |
| JShell | Low | Low | High | Medium |
| jlink | Low | High | High | Low |
| Flight Recorder | High | High | Low | Low |
| ZGC | Low | High | Low | Low |
| TLS 1.3 | High | High | Low | Low |
| JPMS | High | Medium | Low | High |
The Migration Decision
Upgrade to Java 11 directly from Java 8?
Yes, in most cases. The key concerns:
- JAXB/JAX-WS usage — Check with
jdeps --multi-release 11 --class-path . myapp.jar. If your app usesjavax.xml.bind.*, you must add the external Jakarta JAXB dependency. - Internal API access — Libraries using
sun.misc.*orsun.reflect.*need updated versions. ASM 7.0+, Byte Buddy 1.9+, cglib 3.2.8+. - Build tool versions — Maven 3.6.1+, Gradle 4.7+, surefire plugin 2.22.0+.
- 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