Java is a programming language and software platform. Examples of applications that use Java are numerous and widespread but include web browsers, office applications, and even games like Minecraft are based on Java.
The full version string for this update release is 25.0.1+8 (where "+" means "build"). The version number is 25.0.1. Complete release notes for Java 25 can be found here.
If you need to run Java applications, downloading and installing the JRE (Java Runtime Environment) is enough. If you're developing Java applications, you'll want to download the JDK, which also includes the JRE.
For full information and terms, refer to the OTN License Agreement for Java SE. The OTN License Agreement for Java SE for current Oracle Java SE releases allows them to be used, without cost:
- (i) For personal use on a desktop or laptop computer, such as to play games or run other personal applications.
- (ii) For development, testing, prototyping, and demonstrating applications, including to use by/with profilers, debuggers, and Integrated Development Environment tools.
- (iii) For use with some approved products, such as Oracle SQL Developer, or as an end user of a software application created by an approved product. (referred to as "Schedule A" and "Schedule B" Products in the OTN License Agreement for Java SE)
- (iv) With identified Oracle Cloud Infrastructure products.
The latest version of Java is Java 26 or JDK 26 released on March 2026. However, many versions of Java are actively maintained for compatibility purposes. Java 8, Java 11, Java 17, Java 21, and Java 25 are the five long-term support versions recommended by Oracle alongside the latest release. You can download the version you need below:
- Java SE 26 Download
- Java SE 25 Download (LTS, recommended)
- Java SE 24 Download
- Java SE 23 Download
- Java SE 22 Download
- Java SE 21 Download (LTS, recommended)
- Java SE 20 Download
- Java SE 19 Download
- Java SE 18 Download
- Java SE 17 Download (LTS, recommended)
- Java SE 16 Download
- Java SE 15 Download
- Java SE 11 Download (LTS, recommended)
- Java SE 9 Download
- Java SE 8 Download (LTS, recommended)
Java 8 is the last free software public update for commercial use, which explains why it remains popular even though it was released back in 2014. Oracle plans to maintain it until at least 2030. Also, you should know that some applications might refer to Java 8 as version 1.8.0.
What is Java JDK?
The Java Development Kit (JDK) is the full-featured software development kit for Java developers. It has everything the JRE has, but adds the compiler (javac) and tools (like javadoc and jdb). The JDK allows you to create and compile Java programs.
Is Java free to use?
Yes, Java is free to use under the jdk.java.net license. This means anyone can download it for personal or development use at no cost. Oracle does charge for long term support, but this is optional.
Keeping the JDK up to Date
Oracle recommends that the JDK is updated with each Critical Patch Update. In order to determine if a release is the latest, the Security Baseline page can be used to determine which is the latest version for each release family.
Critical patch updates, which contain security vulnerability fixes, are announced one year in advance on Critical Patch Updates, Security Alerts and Bulletins. It is not recommended that this JDK (version 25.0.1) be used after the next critical patch update scheduled for January 20, 2026.
Java Management Service, available to all users, can help you find vulnerable Java versions in your systems. Java SE Subscribers and customers running in Oracle Cloud can use Java Management Service to update Java Runtimes and to do further security reviews like identifying potentially vulnerable third party libraries used by your Java programs. Existing Java Management Service user click here to log in to your dashboard. The Java Management Service Documentation provides a list of features available to everyone and those available only to customers. Learn more about using Java Management Service to monitor and secure your Java Installations.
What's New
The full version string for this update release is 25.0.2+10 (where "+" means "build"). The version number is 25.0.2. This JDK conforms to version 25 of the Java SE Specification (JSR 400 2025-09-16).
New Features (complete release notes can be found here)
This section describes some of the enhancements in Java SE 25 and JDK 25. In some cases, the descriptions provide links to additional detailed information about an issue or a change. The APIs described here are provided with the Oracle JDK. It includes a complete implementation of the Java SE 25 Platform and additional Java APIs to support developing, debugging, and monitoring Java applications. Another source of information about important enhancements and new features in Java SE 25 and JDK 25 is the Java SE 25 ( JSR 400) Platform Specification, which documents the changes to the specification made between Java SE 24 and Java SE 25. This document includes descriptions of those new features and enhancements that are also changes to the specification. The descriptions also identify potential compatibility issues that you might encounter when migrating to JDK 25.
New Features
core-libs/java.rmi
➜ Endpoint Identification Enabled By Default for RMI Connections Over TLS (JDK-8341496 (not public))
RMI will use TLS connections if the javax.rmi.ssl.SslRMIClientSocketFactory class is used. These connections now have TLS endpoint identification enabled by default. This may cause some previously-working TLS connections to fail. If this occurs, ensure that the certificate presented by the server has a Subject Alternative Name that matches the server's hostname. Alternatively, endpoint identification for RMI TLS connections can be disabled on the client side by setting the jdk.rmi.ssl.client.enableEndpointIdentification system property to false.
core-libs/java.lang
➜ New getChars(int, int, char[], int) Method in CharSequence and CharBuffer (JDK-8343110)
A new method, getChars(int, int, char[], int), has been added to java.lang.CharSequence and java.nio.CharBuffer to bulk-read characters from a region of a CharSequence into a region of a char[]. String, StringBuilder, and CharBuffer implement CharSequence. Code that operates on a CharSequence should no longer need to special-case and cast to String when needing to bulk-read from a sequence. The new method may be more efficient than a loop over characters of the sequence.
core-libs/java.lang
➜ Add Standard System Property stdin.encoding (JDK-8350703)
A new system property, stdin.encoding, has been added. This property contains the name of the recommended Charset for reading character data from System.in, for example, when using InputStreamReader or Scanner. By default, the property is set in a system-specific fashion based on querying the OS and user environment. Note that its value may differ from the value of the file.encoding property, the default Charset, and the value of the native.encoding property. The value of stdin.encoding may be overridden to be UTF-8 by providing the argument -Dstdin.encoding=UTF-8 on the command line.
See Default Charsets for Standard Output, Standard Input, and Standard Error Streams for more information.
core-libs/java.net
➜ New Methods on BodyHandlers and BodySubscribers to Limit the Number of Response Body Bytes Accepted by the HttpClient (JDK-8328919)
Two new methods, java.net.http.HttpResponse.BodyHandlers.limiting(BodyHandler downstreamHandler, long capacity) and java.net.http.HttpResponse.BodySubsribers.limiting(BodySubscriber downstreamSubscriber, long capacity), are added to the HttpClient API. These methods extend an existing BodyHandler or BodySubscriber with the ability to limit the number of response body bytes that the application is willing to accept in response to an HTTP request. Upon reaching the limit when reading the response body, an IOException will be raised and reported to the downstream subscriber. The subscription will be cancelled. Any further response body bytes will be discarded. This makes it possible for the application to control the maximum amount of bytes that it wants to accept from the server.
core-libs/java.net
➜ New connectionLabel Method in java.net.http.HttpResponse to Identify Connections (JDK-8350279)
A new connectionLabel method has been added to java.net.http.HttpResponse. This new method returns an opaque connection label that callers can leverage to associate a response with the connection it is carried on. This is useful to determine whether two requests were carried on the same connection or on different connections.
core-libs/java.nio
➜ New Property to Construct ZIP FileSystem as Read-only (JDK-8350880)
The ZIP file system provider is updated to allow a ZIP file system be created as a read-only or read-write file system. When creating a ZIP file system, the property name "accessMode" can be used with a value of "readOnly" or " readWrite" to specify the desired mode. If the property is not provided then the file system is created as a read-write file system if possible.
The following example creates a read-only file system:
- FileSystem zipfs = FileSystems.newFileSystem(pathToZipFile, Map.of("accessMode","readOnly"));
- See the jdk.zipfs module description for more information on this and other properties supported by the ZIP file system provider.
core-libs/java.util.concurrent
➜ Updates to ForkJoinPool and CompletableFuture (JDK-8319447)
java.util.concurrent.ForkJoinPool is updated in this release to implement ScheduledExecutorService. This API update can help the performance of delayed task handling in network and other applications where delayed tasks are used for timeout handling, and where most timeouts are cancelled.
In addition to the schedule methods defined by ScheduledExecutorService, ForkJoinPool now defines a new method submitWithTimeout to submit a task that is cancelled (or some other action executed) if the timeout expires before the task completes.
As part of the update, CompletableFuture and SubmissionPublisher are changed so that all async methods without an explicit Executor are performed using the ForkJoinPool common pool. This differs to previous releases where a new thread was created for each async task when the ForkJoinPool common pool was configured with parallelism less than 2.
core-libs/java.util.jar
➜ java.util.zip.Inflater and java.util.zip.Deflater Enhanced To Implement AutoCloseable (JDK-8225763)
java.util.zip.Inflater and java.util.zip.Deflater now implement AutoCloseable and can be used with the try-with-resources statement. Applications could previously invoke the end() method to release the resources held by the Inflater/Deflater instance. Now, either the end() or the close() method can be invoked to do the same.
core-svc
➜ Thread Dumps Generated by HotSpotDiagnosticMXBean.dumpThreads and jcmd Thread.dump_to_file Updated to Include Lock Information (JDK-8356870)
The thread dump generated by the com.sun.management.HotSpotDiagnosticMXBean.dumpThreads API, and the diagnostic command jcmd
The HotSpotDiagnosticMXBean.dumpThreads API is also updated to link to a JSON schema that describes the JSON format thread dump. The JSON format thread dump is intended to be read and processed by diagnostic tools.
Unlike the traditional thread dump generated by jstack and jcmd
hotspot/gc
➜ G1 Reduces Remembered Set Overhead by Grouping Regions into Shared Card Sets (JDK-8343782)
The G1 garbage collector further reduces remembered set memory overhead and pause-time by allowing multiple regions to share a single internal structure (G1CardSet) when they are likely to be collected together during a Mixed GC.
Previously, each region maintained its own G1CardSet, resulting in high memory overhead and redundant tracking of references between regions that would eventually be collected as a group. In the new design, regions expected to be evacuated together are grouped after the Remark phase and assigned a shared G1CardSet, eliminating the need to track references between them individually.
This improves memory efficiency and reduces merge time during collection pauses.
hotspot/jfr
➜ New JFR Annotation for Contextual Information (JDK-8356698)
A new annotation, jdk.jfr.Contextual, has been introduced to mark fields in custom JFR events that contain contextual information relevant to other events occurring in the same thread. For example, fields in a user-defined HTTP request event can be annotated with @Contextual to associate its URL and trace ID with events that occur during its execution, such as a jdk.JavaMonitorEnter event due to a contended logger.
Tools can now pair higher-level information, such as span and trace IDs, with lower-level events. The print command of the jfr tool, included in the JDK, displays this contextual information alongside JVM and JDK events, for example, in events for lock contention, I/O, or exceptions that occur during a trace span or an HTTP request event.
