JDK Features
For the following JDK features we have in-depth descriptions here at the Java Version Almanac:
All Features
Overview of all new features (excluding previews) of all Java releases:
| Feature | References | Release |
|---|---|---|
| Remove the Applet API | JEP 504 | Java 26 |
| HTTP/3 for the HTTP Client API | JEP 517 | Java 26 |
| G1 GC: Improve Throughput by Reducing Synchronization | JEP 522 | Java 26 |
| Remove the 32-bit x86 Port | JEP 503 | Java 25 |
| Scoped Values | JEP 506 | Java 25 |
| Key Derivation Function API | JEP 510 | Java 25 |
| Module Import Declarations | JEP 511 | Java 25 |
| Compact Source Files and Instance Main Methods | JEP 512 | Java 25 |
| Flexible Constructor Bodies | JEP 513 | Java 25 |
| Ahead-of-Time Command-Line Ergonomics | JEP 514 | Java 25 |
| Ahead-of-Time Method Profiling | JEP 515 | Java 25 |
| JFR Cooperative Sampling | JEP 518 | Java 25 |
| Compact Object Headers | JEP 519 | Java 25 |
| JFR Method Timing & Tracing | JEP 520 | Java 25 |
| Generational Shenandoah | JEP 521 | Java 25 |
| Late Barrier Expansion for G1 | JEP 475 | Java 24 |
| Remove the Windows 32-bit x86 Port | JEP 479 | Java 24 |
| Ahead-of-Time Class Loading & Linking | JEP 483 | Java 24 |
| ZGC: Remove the Non-Generational Mode | JEP 490 | Java 24 |
| Synchronize Virtual Threads without Pinning | JEP 491 | Java 24 |
| Deprecate the 32-bit x86 Port for Removal | JEP 501 | Java 24 |
| Prepare to Restrict the Use of JNI | JEP 472 | Java 24 |
| Class-File API | JEP 484 | Java 24 |
| Stream Gatherers | JEP 485 | Java 24 |
| Permanently Disable the Security Manager | JEP 486 | Java 24 |
| Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism | JEP 496 | Java 24 |
| Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm | JEP 497 | Java 24 |
| Warn upon Use of Memory-Access Methods in sun.misc.Unsafe | JEP 498 | Java 24 |
| Linking Run-Time Images without JMODs | JEP 493 | Java 24 |
| Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal | JEP 471 | Java 23 |
| ZGC: Generational Mode by Default | JEP 474 | Java 23 |
| Markdown Documentation Comments | JEP 467 | Java 23 |
| Region Pinning for G1 | JEP 423 | Java 22 |
| Unnamed Variables & Patterns | JEP 456 | Java 22 |
| Foreign Function & Memory API | JEP 454 | Java 22 |
| Launch Multi-File Source-Code Programs | JEP 458 | Java 22 |
| Generational ZGC | JEP 439 | Java 21 |
| Deprecate the Windows 32-bit x86 Port for Removal | JEP 449 | Java 21 |
| Prepare to Disallow the Dynamic Loading of Agents | JEP 451 | Java 21 |
| Record Patterns | JEP 440, Java Almanac | Java 21 |
| Pattern Matching for switch | JEP 441, Java Almanac | Java 21 |
| Sequenced Collections | JEP 431 | Java 21 |
| Virtual Threads | JEP 444, Java Almanac | Java 21 |
| Key Encapsulation Mechanism API | JEP 452 | Java 21 |
| Linux/RISC-V Port | JEP 422 | Java 19 |
| UTF-8 by Default | JEP 400 | Java 18 |
| Simple Web Server | JEP 408 | Java 18 |
| Code Snippets in Java API Documentation | JEP 413 | Java 18 |
| Reimplement Core Reflection with Method Handles | JEP 416 | Java 18 |
| Internet-Address Resolution SPI | JEP 418 | Java 18 |
| Deprecate Finalization for Removal | JEP 421 | Java 18 |
| Restore Always-Strict Floating-Point Semantics | JEP 306 | Java 17 |
| New macOS Rendering Pipeline | JEP 382 | Java 17 |
| macOS/AArch64 Port | JEP 391 | Java 17 |
| Enhanced Pseudo-Random Number Generators | JEP 356 | Java 17 |
| Deprecate the Applet API for Removal | JEP 398 | Java 17 |
| Strongly Encapsulate JDK Internals | JEP 403 | Java 17 |
| Remove RMI Activation | JEP 407 | Java 17 |
| Sealed Classes | JEP 409, Java Almanac | Java 17 |
| Remove the Experimental AOT and JIT Compiler | JEP 410 | Java 17 |
| Deprecate the Security Manager for Removal | JEP 411 | Java 17 |
| ZGC: Concurrent Thread Processing | JEP 376 | Java 16 |
| Alpine Linux Port | JEP 386 | Java 16 |
| Windows/AArch64 Port | JEP 388 | Java 16 |
| Strongly Encapsulate JDK Internals by Default | JEP 396 | Java 16 |
| Unix-Domain Socket Channels | JEP 380 | Java 16 |
| Warnings for Value-Based Classes | JEP 390 | Java 16 |
| Pattern Matching for instanceof | JEP 394, Java Almanac | Java 16 |
| Records | JEP 395, Java Almanac | Java 16 |
| Static Members in Inner Classes | JEP 395 | Java 16 |
| Packaging Tool | JEP 392 | Java 16 |
| Enable C++14 Language Features | JEP 347 | Java 16 |
| Migrate to Git/GitHub | JEP 357, JEP 369 | Java 16 |
| Disable and Deprecate Biased Locking | JEP 374 | Java 15 |
| ZGC | JEP 377 | Java 15 |
| Shenandoah GC | JEP 379 | Java 15 |
| Remove the Solaris and SPARC Ports | JEP 381 | Java 15 |
| Text Blocks | JEP 378, Java Almanac | Java 15 |
| Edwards-Curve Digital Signature Algorithm (EdDSA) | JEP 339 | Java 15 |
| Hidden Classes | JEP 371 | Java 15 |
| Remove the Nashorn JavaScript Engine | JEP 372 | Java 15 |
| Deprecate RMI Activation for Removal | JEP 385 | Java 15 |
| Reimplement the Legacy DatagramSocket API | JEP 373 | Java 15 |
| NUMA-Aware Memory Allocation for G1 | JEP 345 | Java 14 |
| JFR Event Streaming | JEP 349 | Java 14 |
| Helpful NullPointerExceptions | JEP 358 | Java 14 |
| Deprecate the Solaris and SPARC Ports | JEP 362 | Java 14 |
| Remove the Concurrent Mark Sweep (CMS) Garbage Collector | JEP 363 | Java 14 |
| ZGC on macOS | JEP 364 | Java 14 |
| ZGC on Windows | JEP 365 | Java 14 |
| Deprecate the ParallelScavenge + SerialOld GC Combination | JEP 366 | Java 14 |
| Switch Expressions | JEP 361, Java Almanac | Java 14 |
| Non-Volatile Mapped Byte Buffers | JEP 352 | Java 14 |
| Remove the Pack200 APIs | JEP 367 | Java 14 |
| Remove the Pack200 Tools | JEP 367 | Java 14 |
| Dynamic CDS Archives | JEP 350 | Java 13 |
| ZGC: Uncommit Unused Memory | JEP 351 | Java 13 |
| Reimplement the Legacy Socket API | JEP 353 | Java 13 |
| Shenandoah GC | JEP 189 | Java 12 |
| JVM Constants | JEP 334 | Java 12 |
| CONSTANT_Dynamic | JEP 309 | Java 11 |
| Epsilon GC | JEP 318 | Java 11 |
| ZGC | JEP 333 | Java 11 |
| Nest-Based Access Control | JEP 181 | Java 11 |
| Low-Overhead Heap Profiling | JEP 331 | Java 11 |
| Improve Aarch64 Intrinsics | JEP 315 | Java 11 |
| Local Variable Syntax for Lambda Parameters | JEP 323 | Java 11 |
| HTTP Client | JEP 321 | Java 11 |
| Java EE and CORBA removed | JEP 320 | Java 11 |
| Unicode 10 Support | JEP 327 | Java 11 |
| Nashorn JavaScript Engine deprecated | JEP 335 | Java 11 |
| New Cryptographic Algorithms | JEP 324, JEP 329 | Java 11 |
| TLS 1.3 | JEP 332 | Java 11 |
| Single Source File Launch | JEP 330 | Java 11 |
| Flight Recorder | JEP 328 | Java 11 |
| Pack200 deprecated | JEP 336 | Java 11 |
| No more frames in JavaDoc | JDK-8196202 | Java 11 |
| Graal VM | JEP 317 | Java 10 |
| GC Interface | JEP 304 | Java 10 |
| Parallel Full GC for G1 | JEP 307 | Java 10 |
| Thread-Local Handshakes | JEP 312 | Java 10 |
| Alternative Memory Devices | JEP 316 | Java 10 |
| Keyword var | JEP 286, Java Almanac | Java 10 |
| Additional Unicode Language-Tag Extensions | JEP 314 | Java 10 |
| javah Removed | JEP 313 | Java 10 |
| Module System | JEP 261 | Java 9 |
| Private Methods in Interfaces | JEP 213 | Java 9 |
| Var Handles | JEP 193 | Java 9 |
| UTF-8 Property Resource Bundles | JEP 226 | Java 9 |
| Compact Strings | JEP 254 | Java 9 |
| Reactive Streams | JEP 266 | Java 9 |
| Enhanced Deprecation | JEP 277 | Java 9 |
| Object.finalize() deprecated | JDK-8165641 | Java 9 |
| jshell | JEP 222 | Java 9 |
| Multi-Release JAR Files | JEP 238 | Java 9 |
| Compile for Older Platform Versions | JEP 247 | Java 9 |
| jlink | JEP 282 | Java 9 |
| Indify String Concatenation | JEP 280 | Java 9 |
| Remove Permanent Generation | JEP 122 | Java 8 |
| Lambda Expressions | JSR 335 | Java 8 |
| Default Methods in Interfaces | JSR 335 | Java 8 |
| Effectively Final Variables | JSR 335 | Java 8 |
| Type Use Annotations | JEP 104 | Java 8 |
| Repeating Annotations | JEP 120 | Java 8 |
| Streams (java.util.stream) | JEP 107 | Java 8 |
| Lambda APIs (java.util.function) | JEP 109 | Java 8 |
| Date Time (java.time) | JSR 310, JEP 150 | Java 8 |
| New Opcode INVOKEDYNAMIC | JSR 292 | Java 7 |
| Switch on String | JSR 334 | Java 7 |
| Try-with | JSR 334 | Java 7 |
| Diamond Operator | JSR 334 | Java 7 |
| Binary Integer Literals | JSR 334 | Java 7 |
| Underscores in numeric literals | JSR 334 | Java 7 |
| Multi Catch | JSR 334 | Java 7 |
| Method Handles | JSR 292 | Java 7 |
| NIO.2 (java.nio.file) | JSR 203 | Java 7 |
| XML Digital Signatures (javax.xml.crypto.dsig) | JSR 105 | Java 6 |
| Streaming API for XML 1.0 (javax.xml.stream) | JSR 173 | Java 6 |
| Web Services Metadata (javax.jws) | JSR 181 | Java 6 |
| Java API for XML Processing 1.3 (javax.xml.*) | JSR 206 | Java 6 |
| JAXB 2.0 (javax.xml.bind) | JSR 222 | Java 6 |
| Scripting for the Java Platform (javax.script) | JSR 223 | Java 6 |
| XML-Based Web Services 2.0 (javax.xml.ws) | JSR 224 | Java 6 |
| Common Annotations (javax.annotations) | JSR 250 | Java 6 |
| Smart Card I/O (javax.smartcardio) | JSR 268 | Java 6 |
| Pluggable Annotation Processing (javax.lang.model) | JSR 269 | Java 6 |
| Java Activation Framework (javax.annotation) | JDK-6254474 | Java 6 |
| javac supports java.lang.SuppressWarnings annotation | JDK-4986256 | Java 6 |
| Generics | JSR 14 | Java 5 |
| Annotations | JSR 175 | Java 5 |
| Autoboxing | JSR 201 | Java 5 |
| Enums | JSR 201 | Java 5 |
| For-each Loops | JSR 201 | Java 5 |
| Static Imports | JSR 201 | Java 5 |
| Var Args | JSR 201 | Java 5 |
| Concurrency Utilities (java.util.concurrent) | JSR 166 | Java 5 |
| Keyword assert | JSR 41 | Java 1.4 |
| Regular Expressions | JSR 51 | Java 1.4 |
| Non-blocking IO | JSR 51 | Java 1.4 |
| Logging | JSR 47 | Java 1.4 |
| Preferences | JSR 10 | Java 1.4 |
| XML APIs | JSR 5 | Java 1.4 |
| XSLT | JSR 63 | Java 1.4 |
| HotSpot | Java 1.3 | |
| JNDI | Java 1.3 | |
| Sound | Java 1.3 | |
| Sun JIT | Java 1.2 | |
| Keyword strictfp | Java 1.2 | |
| Swing | Java 1.2 | |
| Collections | Java 1.2 | |
| Inner Classes | Java 1.1 | |
| JIT (on Windows only by JavaSoft) | Java 1.1 | |
| Java Beans | Java 1.1 | |
| JDBC | Java 1.1 | |
| RMI | Java 1.1 | |
| Reflection | Java 1.1 |