Java version history
What changed in every Java release, from JDK 1.0 in 1996 to Java 27, newest first. Each version lists its featured changes and then all of them. Every item links to the official source (the OpenJDK JEP, JCP specification or Oracle documentation) if you want to learn more.
Java 28
In developmentMarch 2027 (planned)Not released yet. JDK 28 is scheduled for March 2027 and is the first release to preview Project Valhalla’s value objects. Its JEP list can still change; this is the state on October 24, 2026.
Featured
- Value objects (preview) — Project Valhalla’s first preview:
valueclasses and records have no identity, so the JVM can flatten them in memory and==compares their fields. - Simple JSON API (incubator) — A small built-in API to parse, navigate and generate JSON without a third-party library.
- Structured concurrency becomes final — After seven previews,
StructuredTaskScopetreats a group of concurrent subtasks as one unit of work, with clean cancellation and error handling. - PEM encodings become final — Read and write keys and certificates in the PEM text format with a standard API, after three previews.
- Shenandoah: generational mode by default — Shenandoah GC runs in generational mode unless you choose otherwise.
- macOS on Intel deprecated — The macOS/x64 port is deprecated for removal. Apple-silicon Macs are not affected.
All changes in Java 28 (9)
- JEP 401: Value Objects (Preview)
- JEP 535: Shenandoah GC: Generational Mode by Default
- JEP 539: Strict Field Initialization in the JVM (Preview)
- JEP 540: Simple JSON API (Incubator)
- JEP 541: Deprecate the macOS/x64 Port for Removal
- JEP 542: PEM Encodings of Cryptographic Objects
- JEP 543: Structured Concurrency
- JEP 545: Faster Startup and Warmup with ZGC
- JEP 546: Adaptive Heap Sizing for ZGC
Source: OpenJDK JDK 28 project ↗
Java 27
FeatureSeptember 2026The latest release. Mostly runtime and security work: G1 everywhere, compact object headers on by default and post-quantum TLS.
Featured
- G1 is the default GC everywhere — Even on small machines, the JVM now picks G1 instead of the Serial GC.
- Compact object headers by default — Object headers shrink to 8 bytes on 64-bit platforms, reducing heap usage with no code change.
- Post-quantum hybrid key exchange for TLS 1.3 — TLS 1.3 can combine classic key exchange with ML-KEM, protecting today’s traffic against future quantum attacks.
- JFR in-process data redaction — Flight Recorder can remove sensitive values from recordings before they are written.
All changes in Java 27 (9)
- JEP 523: Make G1 the Default Garbage Collector in All Environments
- JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3
- JEP 531: Lazy Constants (Third Preview)
- JEP 532: Primitive Types in Patterns, instanceof, and switch (Fifth Preview)
- JEP 533: Structured Concurrency (Seventh Preview)
- JEP 534: Compact Object Headers by Default
- JEP 536: JFR In-Process Data Redaction
- JEP 537: Vector API (Twelfth Incubator)
- JEP 538: PEM Encodings of Cryptographic Objects (Third Preview)
Source: OpenJDK JDK 27 project ↗
Java 26
FeatureMarch 2026HTTP/3, ahead-of-time caching for any GC, and the first step toward making final fields truly final.
Featured
- HTTP/3 in the HTTP Client —
java.net.http.HttpClientcan use HTTP/3 (QUIC) when you opt in. - Ahead-of-time object caching with any GC — Project Leyden’s AOT cache now works with every garbage collector, including ZGC.
- Prepare to make final mean final — Changing
finalfields through deep reflection now prints warnings; a future release will block it. - Applet API removed —
java.appletand related classes, deprecated since Java 9, are gone.
All changes in Java 26 (10)
- JEP 500: Prepare to Make Final Mean Final
- JEP 504: Remove the Applet API
- JEP 516: Ahead-of-Time Object Caching with Any GC
- JEP 517: HTTP/3 for the HTTP Client API
- JEP 522: G1 GC: Improve Throughput by Reducing Synchronization
- JEP 524: PEM Encodings of Cryptographic Objects (Second Preview)
- JEP 525: Structured Concurrency (Sixth Preview)
- JEP 526: Lazy Constants (Second Preview)
- JEP 529: Vector API (Eleventh Incubator)
- JEP 530: Primitive Types in Patterns, instanceof, and switch (Fourth Preview)
Source: OpenJDK JDK 26 project ↗
Java 25
LTSSeptember 2025The current LTS release. Finalizes many features previewed since Java 21: compact source files, flexible constructors, module imports and scoped values.
Featured
- Compact source files and instance main methods — A complete program can be
void main() { IO.println("Hello"); }, with no class declaration and nostatic. - Flexible constructor bodies — Validate arguments and compute values before calling
super(...)orthis(...). - Module import declarations —
import module java.base;imports every package a module exports. - Scoped values — A safer, faster alternative to
ThreadLocalfor sharing immutable data with callees and child threads. - Compact object headers (opt-in) — Enable with
-XX:+UseCompactObjectHeadersto reduce memory use. It became the default in Java 27. - Faster startup with AOT profiling — Simpler commands to create an ahead-of-time cache, which now also stores method profiles for quicker warmup.
All changes in Java 25 (18)
- JEP 470: PEM Encodings of Cryptographic Objects (Preview)
- JEP 502: Stable Values (Preview)
- JEP 503: Remove the 32-bit x86 Port
- JEP 505: Structured Concurrency (Fifth Preview)
- JEP 506: Scoped Values
- JEP 507: Primitive Types in Patterns, instanceof, and switch (Third Preview)
- JEP 508: Vector API (Tenth Incubator)
- JEP 509: JFR CPU-Time Profiling (Experimental)
- JEP 510: Key Derivation Function API
- JEP 511: Module Import Declarations
- JEP 512: Compact Source Files and Instance Main Methods
- JEP 513: Flexible Constructor Bodies
- JEP 514: Ahead-of-Time Command-Line Ergonomics
- JEP 515: Ahead-of-Time Method Profiling
- JEP 518: JFR Cooperative Sampling
- JEP 519: Compact Object Headers
- JEP 520: JFR Method Timing & Tracing
- JEP 521: Generational Shenandoah
Source: OpenJDK JDK 25 project ↗
Java 24
FeatureMarch 2025A big release with 24 JEPs, including Stream Gatherers, the Class-File API, virtual threads without pinning and the first post-quantum algorithms.
Featured
- Stream Gatherers —
Stream.gather(...)lets you write your own intermediate operations, such as sliding windows. - Virtual threads no longer pin in synchronized — Blocking inside
synchronizedno longer ties a virtual thread to its carrier thread. - Class-File API — A standard API to parse, generate and transform
.classfiles. - Post-quantum cryptography — ML-KEM and ML-DSA, the NIST-standardized quantum-resistant algorithms for key encapsulation and signatures.
- Ahead-of-time class loading & linking — The first Project Leyden feature: record a training run, then start faster from an AOT cache.
- Security Manager permanently disabled — The Security Manager can no longer be enabled.
All changes in Java 24 (24)
- JEP 404: Generational Shenandoah (Experimental)
- JEP 450: Compact Object Headers (Experimental)
- JEP 472: Prepare to Restrict the Use of JNI
- JEP 475: Late Barrier Expansion for G1
- JEP 478: Key Derivation Function API (Preview)
- JEP 479: Remove the Windows 32-bit x86 Port
- JEP 483: Ahead-of-Time Class Loading & Linking
- JEP 484: Class-File API
- JEP 485: Stream Gatherers
- JEP 486: Permanently Disable the Security Manager
- JEP 487: Scoped Values (Fourth Preview)
- JEP 488: Primitive Types in Patterns, instanceof, and switch (Second Preview)
- JEP 489: Vector API (Ninth Incubator)
- JEP 490: ZGC: Remove the Non-Generational Mode
- JEP 491: Synchronize Virtual Threads without Pinning
- JEP 492: Flexible Constructor Bodies (Third Preview)
- JEP 493: Linking Run-Time Images without JMODs
- JEP 494: Module Import Declarations (Second Preview)
- JEP 495: Simple Source Files and Instance Main Methods (Fourth Preview)
- JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
- JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm
- JEP 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe
- JEP 499: Structured Concurrency (Fourth Preview)
- JEP 501: Deprecate the 32-bit x86 Port for Removal
Source: OpenJDK JDK 24 project ↗
Java 23
FeatureSeptember 2024Markdown in Javadoc, generational ZGC by default and more previews. String Templates, previewed in 21 and 22, were withdrawn.
Featured
- Markdown documentation comments — Write Javadoc in Markdown using
///comments instead of HTML. - Generational ZGC by default —
-XX:+UseZGCnow selects the generational mode. - sun.misc.Unsafe memory access deprecated — Unsafe’s memory-access methods are deprecated for removal; use
VarHandleor the FFM API. - Primitive types in patterns (preview) — Patterns,
instanceofandswitchstart to work withint,long,doubleand other primitives.
All changes in Java 23 (13)
- JEP 455: Primitive Types in Patterns, instanceof, and switch (Preview)
- JEP 466: Class-File API (Second Preview)
- JEP 467: Markdown Documentation Comments
- JEP 469: Vector API (Eighth Incubator)
- JEP 471: Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal
- JEP 473: Stream Gatherers (Second Preview)
- JEP 474: ZGC: Generational Mode by Default
- JEP 476: Module Import Declarations (Preview)
- JEP 477: Implicitly Declared Classes and Instance Main Methods (Third Preview)
- JEP 480: Structured Concurrency (Third Preview)
- JEP 481: Scoped Values (Third Preview)
- JEP 482: Flexible Constructor Bodies (Second Preview)
- String Templates (previewed in Java 21 and 22) withdrawn
Source: OpenJDK JDK 23 project ↗
Java 22
FeatureMarch 2024The Foreign Function & Memory API and unnamed variables become final; multi-file programs run without a build tool.
Featured
- Foreign Function & Memory API — Call native libraries and manage off-heap memory from pure Java, a safer replacement for JNI.
- Unnamed variables & patterns — Use
_for variables and pattern parts you don’t need, for examplecatch (Exception _). - Launch multi-file source-code programs —
java Main.javacompiles and runs a program spread across several source files. - Region pinning for G1 — G1 keeps collecting during JNI critical regions instead of pausing garbage collection.
All changes in Java 22 (12)
- JEP 423: Region Pinning for G1
- JEP 447: Statements before super(...) (Preview)
- JEP 454: Foreign Function & Memory API
- JEP 456: Unnamed Variables & Patterns
- JEP 457: Class-File API (Preview)
- JEP 458: Launch Multi-File Source-Code Programs
- JEP 459: String Templates (Second Preview)
- JEP 460: Vector API (Seventh Incubator)
- JEP 461: Stream Gatherers (Preview)
- JEP 462: Structured Concurrency (Second Preview)
- JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)
- JEP 464: Scoped Values (Second Preview)
Source: OpenJDK JDK 22 project ↗
Java 21
LTSSeptember 2023A landmark LTS: virtual threads, record patterns, pattern matching for switch and sequenced collections are all final.
Featured
- Virtual threads — Lightweight threads managed by the JVM. Write simple blocking code and still run huge numbers of concurrent tasks.
- Pattern matching for switch —
switchcan test types and deconstruct values, with exhaustiveness checks for sealed types. - Record patterns — Deconstruct records directly:
if (obj instanceof Point(int x, int y)). - Sequenced collections — New interfaces add
getFirst(),getLast()andreversed()to lists, deques and ordered sets and maps. - Generational ZGC — ZGC can separate young and old objects, lowering CPU and memory overhead.
All changes in Java 21 (15)
- JEP 430: String Templates (Preview)
- JEP 431: Sequenced Collections
- JEP 439: Generational ZGC
- JEP 440: Record Patterns
- JEP 441: Pattern Matching for switch
- JEP 442: Foreign Function & Memory API (Third Preview)
- JEP 443: Unnamed Patterns and Variables (Preview)
- JEP 444: Virtual Threads
- JEP 445: Unnamed Classes and Instance Main Methods (Preview)
- JEP 446: Scoped Values (Preview)
- JEP 448: Vector API (Sixth Incubator)
- JEP 449: Deprecate the Windows 32-bit x86 Port for Removal
- JEP 451: Prepare to Disallow the Dynamic Loading of Agents
- JEP 452: Key Encapsulation Mechanism API
- JEP 453: Structured Concurrency (Preview)
Source: OpenJDK JDK 21 project ↗
Java 20
FeatureMarch 2023A preview-only release that refined the features finalized in Java 21.
Featured
- Scoped values (incubator) — The first look at scoped values, an immutable alternative to thread-local variables.
- Virtual threads (second preview) — Further refinement before virtual threads became final in Java 21.
- Record patterns (second preview) — Adds type inference for generic record patterns.
All changes in Java 20 (7)
- JEP 429: Scoped Values (Incubator)
- JEP 432: Record Patterns (Second Preview)
- JEP 433: Pattern Matching for switch (Fourth Preview)
- JEP 434: Foreign Function & Memory API (Second Preview)
- JEP 436: Virtual Threads (Second Preview)
- JEP 437: Structured Concurrency (Second Incubator)
- JEP 438: Vector API (Fifth Incubator)
Source: OpenJDK JDK 20 project ↗
Java 19
FeatureSeptember 2022Virtual threads and structured concurrency appear for the first time, as preview and incubator features.
Featured
- Virtual threads (preview) — Project Loom’s headline feature ships for the first time, behind
--enable-preview. - Structured concurrency (incubator) — Treat related tasks running in different threads as one unit of work.
- Record patterns (preview) — The first preview of deconstructing records in patterns.
- Linux/RISC-V port — The JDK officially runs on 64-bit RISC-V Linux.
All changes in Java 19 (7)
Source: OpenJDK JDK 19 project ↗
Java 18
FeatureMarch 2022UTF-8 becomes the default charset on every platform, and the JDK gains a small built-in web server.
Featured
- UTF-8 by default — APIs that use the default charset now use UTF-8 on every OS, ending many platform-specific encoding bugs.
- Simple web server —
jwebserverserves static files from a directory, handy for testing and teaching. - Code snippets in Javadoc — The
@snippettag shows validated example code in API documentation. - Finalization deprecated for removal —
finalize()is on its way out; use try-with-resources orCleanerinstead.
All changes in Java 18 (9)
- JEP 400: UTF-8 by Default
- JEP 408: Simple Web Server
- JEP 413: Code Snippets in Java API Documentation
- JEP 416: Reimplement Core Reflection with Method Handles
- JEP 417: Vector API (Third Incubator)
- JEP 418: Internet-Address Resolution SPI
- JEP 419: Foreign Function & Memory API (Second Incubator)
- JEP 420: Pattern Matching for switch (Second Preview)
- JEP 421: Deprecate Finalization for Removal
Source: OpenJDK JDK 18 project ↗
Java 17
LTSSeptember 2021An LTS that finalizes sealed classes and strongly encapsulates JDK internals. Oracle introduced its free NFTC license with this release.
Featured
- Sealed classes — Control which classes may extend a type:
sealed interface Shape permits Circle, Square. - Strongly encapsulated JDK internals — Internal JDK APIs can no longer be opened with a single launcher flag; use
--add-opensfor specific packages. - Enhanced pseudo-random number generators — New
RandomGeneratorinterfaces and algorithms such as LXM. - macOS/AArch64 port — Native support for Apple-silicon Macs.
- Pattern matching for switch (preview) — The first preview of type patterns in
switch.
All changes in Java 17 (14)
- JEP 306: Restore Always-Strict Floating-Point Semantics
- JEP 356: Enhanced Pseudo-Random Number Generators
- JEP 382: New macOS Rendering Pipeline
- JEP 391: macOS/AArch64 Port
- 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 410: Remove the Experimental AOT and JIT Compiler
- JEP 411: Deprecate the Security Manager for Removal
- JEP 412: Foreign Function & Memory API (Incubator)
- JEP 414: Vector API (Second Incubator)
- JEP 415: Context-Specific Deserialization Filters
Source: OpenJDK JDK 17 project ↗
Java 16
FeatureMarch 2021Records and pattern matching for instanceof become final. OpenJDK moved to Git and GitHub.
Featured
- Records —
record Point(int x, int y) {}declares an immutable data class with constructor, accessors,equals,hashCodeandtoString. - Pattern matching for instanceof —
if (obj instanceof String s)tests and casts in one step. - Strong encapsulation by default — Illegal reflective access to JDK internals is denied by default.
- Packaging tool —
jpackagebuilds native installers (.msi, .dmg, .deb, .rpm) for Java applications. - Stream.toList() — A shorter way to collect a stream into an unmodifiable list.
All changes in Java 16 (18)
- JEP 338: Vector API (Incubator)
- JEP 347: Enable C++14 Language Features
- JEP 357: Migrate from Mercurial to Git
- JEP 369: Migrate to GitHub
- JEP 376: ZGC: Concurrent Thread-Stack Processing
- JEP 380: Unix-Domain Socket Channels
- JEP 386: Alpine Linux Port
- JEP 387: Elastic Metaspace
- JEP 388: Windows/AArch64 Port
- JEP 389: Foreign Linker API (Incubator)
- JEP 390: Warnings for Value-Based Classes
- JEP 392: Packaging Tool
- JEP 393: Foreign-Memory Access API (Third Incubator)
- JEP 394: Pattern Matching for instanceof
- JEP 395: Records
- JEP 396: Strongly Encapsulate JDK Internals by Default
- JEP 397: Sealed Classes (Second Preview)
- API: Stream.toList()
Source: OpenJDK JDK 16 project ↗
Java 15
FeatureSeptember 2020Text blocks are final, ZGC and Shenandoah become production-ready, and Nashorn is removed.
Featured
- Text blocks — Multi-line string literals with
""", ideal for JSON, SQL and HTML. - ZGC ready for production — The low-latency Z Garbage Collector is no longer experimental.
- Shenandoah ready for production — The low-pause Shenandoah GC is no longer experimental.
- Hidden classes — Classes that frameworks generate at run time and that other code cannot reference directly.
- Sealed classes (preview) — The first preview of restricting which classes can extend a type.
All changes in Java 15 (14)
- JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)
- JEP 360: Sealed Classes (Preview)
- JEP 371: Hidden Classes
- JEP 372: Remove the Nashorn JavaScript Engine
- JEP 373: Reimplement the Legacy DatagramSocket API
- JEP 374: Disable and Deprecate Biased Locking
- JEP 375: Pattern Matching for instanceof (Second Preview)
- JEP 377: ZGC: A Scalable Low-Latency Garbage Collector
- JEP 378: Text Blocks
- JEP 379: Shenandoah: A Low-Pause-Time Garbage Collector
- JEP 381: Remove the Solaris and SPARC Ports
- JEP 383: Foreign-Memory Access API (Second Incubator)
- JEP 384: Records (Second Preview)
- JEP 385: Deprecate RMI Activation for Removal
Source: OpenJDK JDK 15 project ↗
Java 14
FeatureMarch 2020Switch expressions become final, NullPointerExceptions finally say what was null, and records appear in preview.
Featured
- Switch expressions —
switchcan return a value and usecase A, B ->arrows with no fall-through. - Helpful NullPointerExceptions — Messages name exactly which variable or call was null, such as
because "user.address" is null. - Records (preview) — The first preview of compact data classes.
- JFR event streaming — Consume Flight Recorder events continuously while the application runs.
- CMS garbage collector removed — The Concurrent Mark Sweep collector, deprecated in Java 9, is gone.
All changes in Java 14 (16)
- JEP 305: Pattern Matching for instanceof (Preview)
- JEP 343: Packaging Tool (Incubator)
- JEP 345: NUMA-Aware Memory Allocation for G1
- JEP 349: JFR Event Streaming
- JEP 352: Non-Volatile Mapped Byte Buffers
- JEP 358: Helpful NullPointerExceptions
- JEP 359: Records (Preview)
- JEP 361: Switch Expressions
- JEP 362: Deprecate the Solaris and SPARC Ports
- JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
- JEP 364: ZGC on macOS
- JEP 365: ZGC on Windows
- JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination
- JEP 367: Remove the Pack200 Tools and API
- JEP 368: Text Blocks (Second Preview)
- JEP 370: Foreign-Memory Access API (Incubator)
Source: OpenJDK JDK 14 project ↗
Java 13
FeatureSeptember 2019A small release: text blocks appear in preview and the legacy socket implementation is rewritten.
Featured
- Text blocks (preview) — The first preview of
"""multi-line strings. - Dynamic CDS archives — Create a class-data sharing archive at application exit for faster startup.
- Reimplemented legacy Socket API — A simpler, modern implementation behind
java.net.Socket, preparing for virtual threads.
All changes in Java 13 (5)
Source: OpenJDK JDK 13 project ↗
Java 12
FeatureMarch 2019Switch expressions appear in preview and the Shenandoah GC arrives as an experimental collector.
Featured
- Switch expressions (preview) — The first preview of
switchthat returns a value. - Shenandoah GC (experimental) — A collector with pause times independent of heap size.
- Default CDS archives — The JDK ships with a class-data sharing archive, so startup is faster out of the box.
- New library methods —
Collectors.teeing,String.indent,String.transform,Files.mismatchand compact number formatting.
All changes in Java 12 (9)
- JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
- JEP 230: Microbenchmark Suite
- JEP 325: Switch Expressions (Preview)
- JEP 334: JVM Constants API
- JEP 340: One AArch64 Port, Not Two
- JEP 341: Default CDS Archives
- JEP 344: Abortable Mixed Collections for G1
- JEP 346: Promptly Return Unused Committed Memory from G1
- API: Collectors.teeing, String.indent/transform, Files.mismatch, CompactNumberFormat
Source: OpenJDK JDK 12 project ↗
Java 11
LTSSeptember 2018The first LTS under the six-month cadence. Adds the standard HTTP Client and single-file programs, and removes Java EE and CORBA modules. Oracle JDK became a commercial product and OpenJDK builds became the free option.
Featured
- HTTP Client —
java.net.http.HttpClientsupports HTTP/1.1, HTTP/2, WebSocket, and synchronous and asynchronous calls. - Launch single-file programs — Run
java Hello.javawith no separatejavacstep. - `var` in lambda parameters —
(var x, var y) -> x + y, which lets you add annotations to inferred parameters. - Java EE and CORBA modules removed — JAXB, JAX-WS, JavaBeans Activation and CORBA left the JDK; add them as dependencies instead.
- Flight Recorder and TLS 1.3 — JFR became open source and free to use; TLS 1.3 support arrived.
- New String and Files methods —
isBlank,lines,strip,repeat,Files.readStringandFiles.writeString.
All changes in Java 11 (19)
- JEP 181: Nest-Based Access Control
- JEP 309: Dynamic Class-File Constants
- JEP 315: Improve Aarch64 Intrinsics
- JEP 318: Epsilon: A No-Op Garbage Collector (Experimental)
- JEP 320: Remove the Java EE and CORBA Modules
- JEP 321: HTTP Client (Standard)
- JEP 323: Local-Variable Syntax for Lambda Parameters
- JEP 324: Key Agreement with Curve25519 and Curve448
- JEP 327: Unicode 10
- JEP 328: Flight Recorder
- JEP 329: ChaCha20 and Poly1305 Cryptographic Algorithms
- JEP 330: Launch Single-File Source-Code Programs
- JEP 331: Low-Overhead Heap Profiling
- JEP 332: Transport Layer Security (TLS) 1.3
- JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
- JEP 335: Deprecate the Nashorn JavaScript Engine
- JEP 336: Deprecate the Pack200 Tools and API
- API: String.isBlank/lines/strip/repeat, Files.readString/writeString, Optional.isEmpty
- JavaFX and Java Web Start no longer included in Oracle JDK
Source: OpenJDK JDK 11 project ↗
Java 10
FeatureMarch 2018The first release on the six-month schedule. It brought var for local variables and time-based version numbers.
Featured
- Local-variable type inference (`var`) —
var list = new ArrayList<String>();lets the compiler infer the type of local variables. - Application class-data sharing — Share loaded application classes between JVMs for faster startup and lower memory use.
- Parallel full GC for G1 — G1’s worst-case full collections use multiple threads.
- Time-based release versioning — Versions follow the
FEATURE.INTERIM.UPDATE.PATCHscheme and a release ships every six months.
All changes in Java 10 (13)
- JEP 286: Local-Variable Type Inference
- JEP 296: Consolidate the JDK Forest into a Single Repository
- JEP 304: Garbage-Collector Interface
- JEP 307: Parallel Full GC for G1
- JEP 310: Application Class-Data Sharing
- JEP 312: Thread-Local Handshakes
- JEP 313: Remove the Native-Header Generation Tool (javah)
- JEP 314: Additional Unicode Language-Tag Extensions
- JEP 316: Heap Allocation on Alternative Memory Devices
- JEP 317: Experimental Java-Based JIT Compiler
- JEP 319: Root Certificates
- JEP 322: Time-Based Release Versioning
- API: List.copyOf, Set.copyOf, Map.copyOf, Collectors.toUnmodifiableList, Optional.orElseThrow()
Source: OpenJDK JDK 10 project ↗
Java 9
FeatureSeptember 2017The module system (Project Jigsaw) reorganized the JDK itself. Java 9 also added JShell and collection factory methods, and made G1 the default GC.
Featured
- Java Platform Module System —
module-info.javadeclares what a module requires and exports, giving reliable configuration and strong encapsulation. - JShell — An interactive REPL: type Java expressions and see results immediately.
- Collection factory methods —
List.of(1, 2, 3),Set.of(...)andMap.of(...)create small immutable collections. - G1 becomes the default GC — The Garbage-First collector replaces Parallel GC as the server default.
- jlink — Build a custom, smaller runtime image that contains only the modules your application needs.
- Small language changes — Private interface methods and effectively-final variables in try-with-resources.
All changes in Java 9 (91)
- JEP 102: Process API Updates
- JEP 110: HTTP 2 Client
- JEP 143: Improve Contended Locking
- JEP 158: Unified JVM Logging
- JEP 165: Compiler Control
- JEP 193: Variable Handles
- JEP 197: Segmented Code Cache
- JEP 199: Smart Java Compilation, Phase Two
- JEP 200: The Modular JDK
- JEP 201: Modular Source Code
- JEP 211: Elide Deprecation Warnings on Import Statements
- JEP 212: Resolve Lint and Doclint Warnings
- JEP 213: Milling Project Coin
- JEP 214: Remove GC Combinations Deprecated in JDK 8
- JEP 215: Tiered Attribution for javac
- JEP 216: Process Import Statements Correctly
- JEP 217: Annotations Pipeline 2.0
- JEP 219: Datagram Transport Layer Security (DTLS)
- JEP 220: Modular Run-Time Images
- JEP 221: Simplified Doclet API
- JEP 222: jshell: The Java Shell (Read-Eval-Print Loop)
- JEP 223: New Version-String Scheme
- JEP 224: HTML5 Javadoc
- JEP 225: Javadoc Search
- JEP 226: UTF-8 Property Files
- JEP 227: Unicode 7.0
- JEP 228: Add More Diagnostic Commands
- JEP 229: Create PKCS12 Keystores by Default
- JEP 231: Remove Launch-Time JRE Version Selection
- JEP 232: Improve Secure Application Performance
- JEP 233: Generate Run-Time Compiler Tests Automatically
- JEP 235: Test Class-File Attributes Generated by javac
- JEP 236: Parser API for Nashorn
- JEP 237: Linux/AArch64 Port
- JEP 238: Multi-Release JAR Files
- JEP 240: Remove the JVM TI hprof Agent
- JEP 241: Remove the jhat Tool
- JEP 243: Java-Level JVM Compiler Interface
- JEP 244: TLS Application-Layer Protocol Negotiation Extension
- JEP 245: Validate JVM Command-Line Flag Arguments
- JEP 246: Leverage CPU Instructions for GHASH and RSA
- JEP 247: Compile for Older Platform Versions
- JEP 248: Make G1 the Default Garbage Collector
- JEP 249: OCSP Stapling for TLS
- JEP 250: Store Interned Strings in CDS Archives
- JEP 251: Multi-Resolution Images
- JEP 252: Use CLDR Locale Data by Default
- JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization
- JEP 254: Compact Strings
- JEP 255: Merge Selected Xerces 2.11.0 Updates into JAXP
- JEP 256: BeanInfo Annotations
- JEP 257: Update JavaFX/Media to Newer Version of GStreamer
- JEP 258: HarfBuzz Font-Layout Engine
- JEP 259: Stack-Walking API
- JEP 260: Encapsulate Most Internal APIs
- JEP 261: Module System
- JEP 262: TIFF Image I/O
- JEP 263: HiDPI Graphics on Windows and Linux
- JEP 264: Platform Logging API and Service
- JEP 265: Marlin Graphics Renderer
- JEP 266: More Concurrency Updates
- JEP 267: Unicode 8.0
- JEP 268: XML Catalogs
- JEP 269: Convenience Factory Methods for Collections
- JEP 270: Reserved Stack Areas for Critical Sections
- JEP 271: Unified GC Logging
- JEP 272: Platform-Specific Desktop Features
- JEP 273: DRBG-Based SecureRandom Implementations
- JEP 274: Enhanced Method Handles
- JEP 275: Modular Java Application Packaging
- JEP 276: Dynamic Linking of Language-Defined Object Models
- JEP 277: Enhanced Deprecation
- JEP 278: Additional Tests for Humongous Objects in G1
- JEP 279: Improve Test-Failure Troubleshooting
- JEP 280: Indify String Concatenation
- JEP 281: HotSpot C++ Unit-Test Framework
- JEP 282: jlink: The Java Linker
- JEP 283: Enable GTK 3 on Linux
- JEP 284: New HotSpot Build System
- JEP 285: Spin-Wait Hints
- JEP 287: SHA-3 Hash Algorithms
- JEP 288: Disable SHA-1 Certificates
- JEP 289: Deprecate the Applet API
- JEP 290: Filter Incoming Serialization Data
- JEP 291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector
- JEP 292: Implement Selected ECMAScript 6 Features in Nashorn
- JEP 294: Linux/s390x Port
- JEP 295: Ahead-of-Time Compilation
- JEP 297: Unified arm32/arm64 Port
- JEP 298: Remove Demos and Samples
- JEP 299: Reorganize Documentation
Source: OpenJDK JDK 9 project ↗
Java 8
LTSMarch 2014The release that changed how Java is written: lambdas, streams and a new date-time API. Still widely used in legacy systems.
Featured
- Lambda expressions and method references —
list.forEach(x -> System.out.println(x))andString::lengthpass behavior as values. - Streams —
list.stream().filter(...).map(...).collect(...)processes collections declaratively, optionally in parallel. - Default methods in interfaces — Interfaces can contain method implementations, which let the collections API evolve without breaking code.
- Date and time API (java.time) —
LocalDate,Instant,DurationandZonedDateTimereplace the error-proneDateandCalendar. - Optional —
Optional<T>makes “may be absent” explicit in return types. - Metaspace replaces PermGen — Class metadata moved to native memory, ending most
OutOfMemoryError: PermGen spaceerrors.
All changes in Java 8 (60)
- JEP 101: Generalized Target-Type Inference
- JEP 103: Parallel Array Sorting
- JEP 104: Annotations on Java Types
- JEP 105: DocTree API
- JEP 106: Add Javadoc to javax.tools
- JEP 107: Bulk Data Operations for Collections
- JEP 109: Enhance Core Libraries with Lambda
- JEP 112: Charset Implementation Improvements
- JEP 113: MS-SFU Kerberos 5 Extensions
- JEP 114: TLS Server Name Indication (SNI) Extension
- JEP 115: AEAD CipherSuites
- JEP 117: Remove the Annotation-Processing Tool (apt)
- JEP 118: Access to Parameter Names at Runtime
- JEP 119: javax.lang.model Implementation Backed by Core Reflection
- JEP 120: Repeating Annotations
- JEP 121: Stronger Algorithms for Password-Based Encryption
- JEP 122: Remove the Permanent Generation
- JEP 123: Configurable Secure Random-Number Generation
- JEP 124: Enhance the Certificate Revocation-Checking API
- JEP 126: Lambda Expressions & Virtual Extension Methods
- JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data
- JEP 128: BCP 47 Locale Matching
- JEP 129: NSA Suite B Cryptographic Algorithms
- JEP 130: SHA-224 Message Digests
- JEP 131: PKCS#11 Crypto Provider for 64-bit Windows
- JEP 133: Unicode 6.2
- JEP 135: Base64 Encoding & Decoding
- JEP 136: Enhanced Verification Errors
- JEP 138: Autoconf-Based Build System
- JEP 139: Enhance javac to Improve Build Speed
- JEP 140: Limited doPrivileged
- JEP 142: Reduce Cache Contention on Specified Fields
- JEP 147: Reduce Class Metadata Footprint
- JEP 148: Small VM
- JEP 149: Reduce Core-Library Memory Usage
- JEP 150: Date & Time API
- JEP 153: Launch JavaFX Applications
- JEP 155: Concurrency Updates
- JEP 160: Lambda-Form Representation for Method Handles
- JEP 161: Compact Profiles
- JEP 162: Prepare for Modularization
- JEP 164: Leverage CPU Instructions for AES Cryptography
- JEP 166: Overhaul JKS-JCEKS-PKCS12 Keystores
- JEP 170: JDBC 4.2
- JEP 171: Fence Intrinsics
- JEP 172: DocLint
- JEP 173: Retire Some Rarely-Used GC Combinations
- JEP 174: Nashorn JavaScript Engine
- JEP 176: Mechanical Checking of Caller-Sensitive Methods
- JEP 177: Optimize java.text.DecimalFormat.format
- JEP 178: Statically-Linked JNI Libraries
- JEP 179: Document JDK API Support and Stability
- JEP 180: Handle Frequent HashMap Collisions with Balanced Trees
- JEP 184: HTTP URL Permissions
- JEP 185: Restrict Fetching of External XML Resources
- Default and static methods in interfaces
- java.util.Optional
- CompletableFuture
- Functional interfaces in java.util.function
- JavaFX 8 bundled with Oracle JDK
Source: OpenJDK JDK 8 features ↗
Java SE 7
Major releaseJuly 2011 · “Dolphin”The first release after Oracle acquired Sun, and the first built from OpenJDK. Small language improvements (Project Coin), NIO.2 and the fork/join framework.
Featured
- try-with-resources —
try (InputStream in = new FileInputStream(f)) { ... }closes resources automatically. - Diamond operator —
Map<String, List<Integer>> m = new HashMap<>();infers generic types on construction. - Strings in switch and multi-catch —
switchworks onString;catch (IOException | SQLException e)handles several exceptions at once. - NIO.2 file system API —
Path,FilesandWatchServicereplace much ofjava.io.File. - Fork/join framework —
ForkJoinPoolsplits work recursively across CPU cores. - invokedynamic — A new bytecode instruction for dynamic languages; Java 8 lambdas are built on it.
All changes in Java SE 7 (24)
- Language: strings in switch
- Language: try-with-resources
- Language: multi-catch and more precise rethrow
- Language: diamond operator for generic instance creation
- Language: binary integer literals (0b1010)
- Language: underscores in numeric literals (1_000_000)
- Language: improved varargs warnings and @SafeVarargs
- JVM: invokedynamic for dynamic languages (JSR 292)
- NIO.2: Path, Files, file attributes, WatchService and asynchronous channels (JSR 203)
- Concurrency: fork/join framework, Phaser, TransferQueue, ThreadLocalRandom
- java.util.Objects utility methods
- Parallel-capable class loaders
- URLClassLoader.close()
- Unicode 6.0
- Locale enhancements (IETF BCP 47 language tags)
- Elliptic-curve cryptography provider (SunEC)
- TLS 1.1 and 1.2 support in JSSE
- Sockets Direct Protocol (SDP) and SCTP
- JDBC 4.1
- Swing: JLayer component and Nimbus look and feel
- Swing/AWT: translucent and shaped windows
- Java 2D: XRender pipeline on Linux
- XML stack updates: JAXP 1.4, JAXB 2.2, JAX-WS 2.2
- G1 garbage collector fully supported (from 7u4)
Source: OpenJDK JDK 7 features ↗
Java SE 6
Major releaseDecember 2006 · “Mustang”Dropped the “J2SE” name. Focused on tooling, scripting, web services and desktop integration rather than language changes.
Featured
- Scripting API —
javax.scriptruns JavaScript and other scripting languages from Java; it shipped with Rhino. - Compiler API —
javax.tools.JavaCompilercompiles Java source from inside a running program. - Pluggable annotation processing — Annotation processors run inside
javac, the basis of tools like Lombok and MapStruct. - JDBC 4.0 — Drivers load automatically without
Class.forName(...). - Web services in the JDK — JAX-WS 2.0 and JAXB 2.0 were bundled, later removed in Java 11.
All changes in Java SE 6 (17)
- Scripting for the Java Platform (JSR 223)
- Java Compiler API (JSR 199)
- Pluggable Annotation Processing API (JSR 269)
- JDBC 4.0 (JSR 221)
- JAX-WS 2.0 web services (JSR 224)
- JAXB 2.0 XML binding (JSR 222)
- StAX streaming XML parser (JSR 173)
- XML Digital Signature API (JSR 105)
- Web Services Metadata annotations (JSR 181)
- Common Annotations (JSR 250)
- Desktop integration: java.awt.Desktop, SystemTray and splash screens
- Swing: SwingWorker, table sorting and filtering, GroupLayout
- java.io.Console
- Collections: Deque, ArrayDeque, NavigableMap and NavigableSet
- Attach API for monitoring tools
- @Override allowed on interface method implementations
- Java SE 6 Update 10: new Java Plug-in and Nimbus look and feel
Source: JSR 270: Java SE 6 ↗
J2SE 5.0
Major releaseSeptember 2004 · “Tiger”The biggest language update before Java 8: generics, annotations, enums, autoboxing, varargs and the enhanced for loop. Also known as Java 1.5.
Featured
- Generics —
List<String>gives type-safe collections checked at compile time. - Annotations — Metadata such as
@Overrideand@Deprecated; the foundation for Spring, JPA and JUnit. - Enums —
enum Color { RED, GREEN }: type-safe constants that can have fields and methods. - Enhanced for loop —
for (String s : list)iterates arrays and collections. - Autoboxing and varargs — Automatic
int↔Integerconversion, and methods likeprintf(String fmt, Object... args). - java.util.concurrent — Executors, thread pools,
ConcurrentHashMap, locks and atomics.
All changes in J2SE 5.0 (22)
- Language: generics (JSR 14)
- Language: enhanced for loop
- Language: autoboxing and unboxing
- Language: enums
- Language: varargs
- Language: static import
- Language: annotations (JSR 175)
- Concurrency utilities: java.util.concurrent (JSR 166)
- Revised Java Memory Model (JSR 133)
- StringBuilder
- Scanner
- Formatter and printf-style formatting
- Collections: Queue, PriorityQueue, EnumMap, EnumSet
- ProcessBuilder
- java.util.UUID
- Instrumentation API (java.lang.instrument)
- Monitoring and management: JMX built in (JSR 174, JSR 3)
- Class data sharing
- JVM ergonomics: automatic GC and heap selection
- Unicode 4.0 and supplementary characters
- Swing: Synth look and feel and Ocean theme
- Version number changed from 1.5 to 5.0
Source: JSR 176: J2SE 5.0 ↗
J2SE 1.4
Major releaseFebruary 2002 · “Merlin”The first release developed through the Java Community Process. It added assertions, regular expressions, NIO and logging.
Featured
- Assertions —
assert x > 0 : "x must be positive";checks assumptions during development. - Regular expressions —
java.util.regex.PatternandMatcherfor searching and parsing text. - New I/O (NIO) — Buffers, channels and selectors for scalable, non-blocking I/O.
- Logging API —
java.util.loggingbrings built-in logging to the platform. - Exception chaining — Exceptions can carry their cause with
getCause().
All changes in J2SE 1.4 (17)
- Language: assert keyword (JSR 41)
- Regular expressions (java.util.regex)
- New I/O: buffers, channels, selectors, charsets (JSR 51)
- Logging API (JSR 47)
- Chained exceptions and StackTraceElement
- Preferences API (java.util.prefs)
- Image I/O API (javax.imageio)
- XML processing with JAXP integrated (JSR 63)
- Security: JCE, JSSE and JAAS integrated
- Java Web Start included
- IPv6 networking
- Collections: LinkedHashMap, LinkedHashSet, RandomAccess
- CharSequence interface
- Java Print Service API (javax.print)
- JDBC 3.0 (JSR 54)
- Swing: JSpinner, JFormattedTextField, new focus subsystem
- Full-screen exclusive mode
Source: JSR 59: J2SE 1.4 ↗
J2SE 1.3
Major releaseMay 2000 · “Kestrel”Performance and integration: HotSpot became the default JVM and JNDI and Java Sound joined the platform.
Featured
- HotSpot JVM by default — Adaptive just-in-time compilation made Java much faster; HotSpot is still the JVM in most JDKs.
- JNDI included — A standard API for naming and directory services such as LDAP.
- Dynamic proxies —
java.lang.reflect.Proxycreates interface implementations at run time, used by many frameworks. - Java Sound — Audio playback, recording and MIDI.
All changes in J2SE 1.3 (9)
- HotSpot JVM becomes the default
- JNDI (Java Naming and Directory Interface) included
- RMI over IIOP for CORBA interoperability
- Java Sound API
- Java Platform Debugger Architecture (JPDA)
- Dynamic proxy classes (java.lang.reflect.Proxy)
- java.util.Timer and TimerTask
- StrictMath
- Shutdown hooks (Runtime.addShutdownHook)
Source: Java version history ↗
J2SE 1.2
Major releaseDecember 1998 · “Playground”Branded “Java 2”. It tripled the size of the platform with the Collections Framework, Swing and Java 2D.
Featured
- Collections Framework —
List,Set,Map,ArrayList,HashMapand the algorithms inCollections. - Swing — A rich, platform-independent GUI toolkit built on AWT.
- JIT compiler in the JVM — Sun’s JVM included a just-in-time compiler for the first time.
- strictfp — A keyword for platform-independent floating-point results.
All changes in J2SE 1.2 (13)
- Collections Framework
- Swing (Java Foundation Classes) integrated
- Java 2D API
- Drag and drop
- Accessibility API
- Language: strictfp keyword
- JIT compiler included in Sun’s JVM
- Java IDL and CORBA support
- Policy-based, fine-grained security model
- Reference objects (java.lang.ref)
- ThreadLocal
- Java Plug-in for browsers
- Thread.stop, suspend and resume deprecated
Source: Java version history ↗
JDK 1.1
Major releaseFebruary 1997Filled in the platform: inner classes, JDBC, RMI, reflection, serialization and JavaBeans.
Featured
- Inner classes — Classes declared inside other classes, including anonymous classes for event listeners.
- JDBC — A standard API for SQL databases.
- Reflection — Inspect classes, fields and methods at run time.
- Serialization and RMI — Turn objects into bytes, and call methods on objects in another JVM.
- JavaBeans — A component model with properties and events, used by GUI builders.
All changes in JDK 1.1 (12)
- Language: inner and anonymous classes
- JDBC database API
- RMI (Remote Method Invocation)
- Reflection (introspection only)
- Object serialization
- JavaBeans
- AWT delegation event model (listeners)
- JAR file format
- Internationalization: Locale, ResourceBundle, character Readers and Writers
- JNI (Java Native Interface)
- java.math: BigInteger and BigDecimal
- Security API: signed applets and digital signatures
Source: Java version history ↗
JDK 1.0
Major releaseJanuary 1996 · “Oak”The first public release from Sun Microsystems. “Write once, run anywhere”: compile to bytecode and run it on any JVM.
Featured
- The Java language — Classes, interfaces, single inheritance, exceptions and garbage collection, with C-like syntax.
- The Java Virtual Machine — Compiled bytecode runs on any OS with a JVM.
- Built-in threads —
Threadand thesynchronizedkeyword made concurrency part of the language. - Applets — Small programs that ran inside web browsers; removed in Java 26.
All changes in JDK 1.0 (8)
Source: Java version history ↗
About this page
WhichJava is a reference, not a course: we summarize each change in one line and link to the people who wrote it. For JDK 8 and later, “all changes” is the release’s complete JEP list plus notable library additions; earlier releases list their major features. Preview and incubator features can change before they become final. Spotted a mistake? See About & contact.
Choosing a version to install? See which Java version to use →