What's new in Java 17

Last Updated: 2021-11-19

(Changes in JDK 12, 13, 14, 15, 16, 17)

Java 17 is the next LTS version after Java 11. This page summarizes the changes from JDK 12 to JDK 17.

Spec / Language

Core Libs

  • JEP-352: Non-Volatile Mapped Byte Buffers, JDK 14
  • JEP-353: Reimplement the Legacy Socket API
  • JEP-356: Enhanced Pseudo-Random Number Generators, JDK 17
  • JEP-372: Remove the Nashorn JavaScript Engine, JDK 15
  • JEP-373: Reimplement the Legacy DatagramSocket API
  • JEP-380: Unix-Domain Socket Channels, JDK 16
  • JEP-385: Deprecate RMI Activation for Removal, JDK 15
  • JEP-407: Remove RMI Activation, JDK 17
  • JEP-415: Context-Specific Deserialization Filters, JDK 17

Hotspot / Garbage Collection

Updates to G1 and ZGC; introducing Shenandoah.

  • ZGC
    • JEP-351: ZGC: Uncommit Unused Memory, JDK 13
    • JEP-377: ZGC: A Scalable Low-Latency Garbage Collector, JDK 15
    • JEP-376: ZGC: Concurrent Thread-Stack Processing, JDK 16
    • JEP-364: ZGC on macOS, JDK 14
    • JEP-365: ZGC on Windows, JDK 14
  • Shenandoah: A Low-Pause-Time Garbage Collector
  • G1
    • JEP-345: NUMA-Aware Memory Allocation for G1, JDK 14
    • JEP-344: Abortable Mixed Collections for G1, JDK 12
    • JEP-346: Promptly Return Unused Committed Memory from G1, JDK 12

Deprecated and removed:

  • JEP-366: Deprecate the ParallelScavenge + SerialOld GC Combination, JDK 14
  • JEP-363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector, JDK 14

Hotspot Compiler / Runtime

  • JEP-358: Helpful NullPointerExceptions, JDK 14
    • Improve the usability of NullPointerExceptions generated by the JVM by describing precisely which variable was null.
  • JEP-374: Disable and Deprecate Biased Locking
  • JEP-410: Remove the Experimental AOT and JIT Compiler, JDK 17

Class data-sharing (CDS) archive

  • JEP-341 Default CDS Archives, JDK 12
    • Enhance the JDK build process to generate a class data-sharing (CDS) archive, using the default class list, on 64-bit platforms. Improve out-of-the-box startup time.
  • JEP-350 Dynamic CDS Archives, JDK 13


  • JEP-386: Alpine Linux Port
  • JEP-388: Windows/AArch64 Port
  • JEP-391: macOS/AArch64 Port, JDK 17

Deprecated and removed:

  • JEP-362: Deprecate the Solaris and SPARC Ports, JDK 14
  • JEP-381: Remove the Solaris and SPARC Ports
  • JEP-340: One AArch64 Port, Not Two


  • JEP-367: Remove the Pack200 Tools and API, JDK 14
  • Packaging tool: Developers can use jlink to strip the JDK down to the minimal set of modules that are needed, and then use the packaging tool to produce a compressed, installable image that can be deployed to target machines. (e.g. .exe on Windows)
    • JEP-343 Incubator, JDK 14
    • JEP-392 Final, JDK 16

Project Panama: Interconnecting JVM and native code

“foreign” APIs: non-Java API

  • Foreign-Memory Access API
  • Foreign Linker API
  • Vector API: "to express vector computations that reliably compile at runtime to optimal vector hardware instructions on supported CPU architectures and thus achieve superior performance to equivalent scalar computations."
  • JEP 412: Foreign Function & Memory API (Incubator) JDK 17, the evolution of two incubating APIs: the Foreign-Memory Access API and the Foreign Linker API.

Client Libs

  • JEP-398: Deprecate the Applet API for Removal, JDK 17


  • C++14 features are enabled from Java 16
  • Source code is migrated from hg to git and the repo is moved to GitHub
  • JEP-396: Strongly Encapsulate JDK Internals by Default
  • JEP-230: Microbenchmark Suite
  • JEP-334: JVM Constants API
  • JEP-339: Edwards-Curve Digital Signature Algorithm (EdDSA), JDK 15
  • JEP-390: Warnings for Value-Based Classes
  • JEP-349: JFR Event Streaming, JDK 14
    • JFR: Java Flight Recorder. The HotSpot VM emits more than 500 data points using JFR.
  • JEP-382: New macOS Rendering Pipeline, JDK 17
  • JEP-403: Strongly Encapsulate JDK Internals, JDK 17
  • JEP-411: Deprecate the Security Manager for Removal, JDK 17