The following sections summarize changes made in all Java SE 17.0.17 BPR releases. The BPR releases are listed below in date order, most current BPR first. Note that bug fixes in previous BPRs are also included in the current BPR.
Release date: October 21, 2025
Fixes from the prior BPR are included in this version.
October 21, 2025
The full version string for this update release is 17.0.17+8 (where "+" means "build"). The version number is 17.0.17. This JDK conforms to version 17.1 of the Java SE Specification (JSR 392 MR 1 2024-07-02).
For more information, refer to Timezone Data Versions in the JRE Software.
The security baselines for the Java Runtime at the time of the release of JDK 17.0.17 are specified in the following table:
| Java Family Version | Security Baseline (Full Version String) |
|---|---|
| 17 | 17.0.17+8 |
| 11 | 11.0.29+8 |
| 8 | 1.8.0_471-b09 |
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 17.0.17) 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.
TLS protocol specific usage constraints are now supported by the jdk.tls.disabledAlgorithms property in the java.security configuration file, as follows:
UsageConstraint:
usage UsageType { UsageType }
UsageType:
HandshakeSignature | CertificateSignature
HandshakeSignature restricts the use of an algorithm in TLS handshake signatures. CertificateSignature restricts the use of an algorithm in certificate signatures. An algorithm with this constraint cannot include other usage types defined in the jdk.certpath.disabledAlgorithms property. The usage type follows the keyword and more than one usage type can be specified with a whitespace delimiter.
TLS cipher suites can be disabled with the jdk.tls.disabledAlgorithms security property in the java.security configuration file using one or more * wildcard characters. For example, "TLS_RSA_*" disables all cipher suites that start with "TLS_RSA_". Only cipher suites starting with "TLS_" are allowed to have wildcard characters.
java.lang.CharSequence has been updated in this release to define a default isEmpty method that tests if a character sequence is empty. Testing for, and filtering out, empty Strings and other CharSequences is a common occurrence in code and CharSequence::isEmpty can be used as a method reference. Classes that implement java.lang.CharSequence and another interface that defines isEmpty method should be aware of this addition as they may need to be modified to override the isEmpty method.
The XML Signature implementation has been updated to Santuario 3.0.5. Support for four new SHA-3 based ECDSA SignatureMethod algorithms have been added: SignatureMethod.ECDSA_SHA3_224, SignatureMethod.ECDSA_SHA3_256, SignatureMethod.ECDSA_SHA3_384, and SignatureMethod.ECDSA_SHA3_512.
When IPv6 is enabled, the JDK uses dual stack IPv4/IPv6 sockets by default. Binding, connecting, or sending datagrams uses IPv4-mapped IPv6 addresses in this case.
On some hosts running macOS version 15.6.x and above, and macOS 26, it has been observed that when a datagram socket bound to a IPv4 mapped IPv6 address sends a packet, either using the java.net.DatagramSocket or java.nio.channels.DatagramChannel APIs, then the first packet is lost and never gets delivered. A second invocation of send on the same socket, even to the same destination address, correctly delivers the packet and it is received by the recipient.
A bug has been filed with Apple (feedback issue id FB20302424) seeking their assistance. The issue is currently unresolved.
Until the issue is resolved, there are a couple of workarounds that applications can consider:
java command can be launched with -Djava.net.preferIPv4Stack=true to use IPv4 sockets by default.-Djava.net.preferIPv4Stack=true is not acceptable, a more local workaround can be applied by changing the application code to create a java.nio.channels.DatagramChannel with java.net.StandardProtocolFamily.INET as the protocol family and then bind the channel to a IPv4 address.
The following root certificates, which are deactivated and no longer in use, have been removed from the cacerts keystore:
+ alias name "affirmtrustcommercialca [jdk]"
Distinguished Name: CN=AffirmTrust Commercial, O=AffirmTrust, C=US
+ alias name "affirmtrustnetworkingca [jdk]"
Distinguished Name: CN=AffirmTrust Networking, O=AffirmTrust, C=US
+ alias name "affirmtrustpremiumca [jdk]"
Distinguished Name: CN=AffirmTrust Premium, O=AffirmTrust, C=US
+ alias name "affirmtrustpremiumeccca [jdk]"
Distinguished Name: CN=AffirmTrust Premium ECC, O=AffirmTrust, C=US
Linux RPM JDK installers now use systemd instead of init to manage the automatic jar file execution (jexec) service.
The java.net.http.HttpClient will now report HTTP/2 flow control errors to the server when they are detected. This is an implementation detail that should be transparent to users of the HttpClient API, but could result in streams being reset or connections being closed if connecting to a non-conformant HTTP/2 server.
The flow control limits enforced by the client can be specified with two system properties, which can be set on the java command line:
jdk.httpclient.connectionWindowSize specifies the HTTP/2 client connection window size in bytes. The default value, if unspecified, is 2^26. Valid values are in the range [2^16-1, 2^31-1]. If an invalid value is provided, the default value is used. The implementation guarantees that the actual value will be no smaller than the stream window size, which can be configured through the jdk.httpclient.windowsize system property.
jdk.httpclient.windowsize specifies the HTTP/2 client stream window size in bytes. The default value if unspecified is 16777216 or 16 MB. Valid values are in the range [2^14, 2^31-1]. If an invalid value is provided, the default value is used.
Locale data based on Unicode Consortium's CLDR has been upgraded to their version 37. For the detailed locale data changes, please refer to the Unicode Consortium's CLDR release notes:
In this release, new system and security properties are introduced to allow more granular control over the set of JNDI object factories allowed to reconstruct Java objects from JNDI/LDAP and JNDI/RMI contexts:
The new jdk.jndi.ldap.object.factoriesFilter property specifies which object factory classes are allowed to instantiate Java objects from object references returned by JNDI/LDAP contexts. Its default value only allows object factories defined in the java.naming module.
The new jdk.jndi.rmi.object.factoriesFilter property specifies which object factory classes are allowed to instantiate Java objects from object references returned by JNDI/RMI contexts. Its default value only allows object factories defined in the jdk.naming.rmi module.
These new factory filter properties complement the jdk.jndi.object.factoriesFilter global factories filter property by determining if a specific object factory is permitted to instantiate objects for the LDAP or RMI protocols used in JNDI.
An application depending on custom object factories to recreate Java objects from JNDI/LDAP or JNDI/RMI contexts will need to supply a security or system property with an updated value to allow such third-party object factories to reconstruct LDAP or RMI objects. If usage of a factory is denied, the lookup operation may result in a plain instance of javax.naming.Reference instance returned, which may lead to a ClassCastException being thrown in the application.
The HotSpot runtime code has been updated to additionally print a container's 'rss' and 'cache'. The additional output can be found in the JVM's response to a "jcmd [PID] VM.info" request and in the hs_err file generated in case of JVM abrupt termination.
This will help monitoring and troubleshooting OutOfMemory situations as OOM killer can terminate a process if its rss + cache usage reaches the max memory limit of the container.
The Local Computer key store is accessed using the CERT_STORE_MAXIMUM_ALLOWED_FLAG. Since this store is typically managed by administrators for security reasons, processes are only given read-only access to specific private keys. By opening the store in read-only mode, non-elevated processes can now securely use these keys without requiring elevated permissions.
On Solaris, the CKM_TLS_KEY_AND_MAC_DERIVE mechanism offered by the SunPKCS11-Solaris provider and specific to TLSv1.0, can derive incorrect key data causing TLSv1.0 communication failure. That mechanism has been disabled via the $JAVA_HOME/conf/security/sunpkcs11-solaris.cfg configuration file. The JCE provider now manages these cryptographic requests.
On Solaris, the CKM_DH_PKCS_KEY_PAIR_GEN and CKM_DH_PKCS_DERIVE mechanisms offered by the SunPKCS11-Solaris provider have been disabled via the $JAVA_HOME/conf/security/sunpkcs11-solaris.cfg configuration file. The SunJCE provider also supports these DH crypto services and may be chosen instead. The DH mechanisms can be re-enabled by removing them from the "disabledMechanisms" section of the configuration file. However, please note that the DHParameterSpec object for any generated DH key pair will always have its optional L value (the private value length) set to 0.
Command line arguments to the Java launcher are no longer converted with Windows' "best-fit" mapping when the arguments include unmappable characters for the ANSI code page. This mapping has been intervening in the Java launcher's argument parsing. Unmappable characters are now replaced with the default replacement character, such as '?' in some cases. For rare cases, where applications need those unmappable characters on the command line, select UTF-8 in Windows Regional Settings.
The XPath processor prevents evaluation of external DTD references in raw XML documents if secure processing is enabled explicitly, such as follows:
XPathFactory xf = XPathFactory.newInstance();
xf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
This process will cause the XPath processor created via the factory to throw XPathExpressionException if used to evaluate a raw XML document that contains external references such as an external DTD.
Mitigation includes using External Access Properties to override that enabled by FSP. For example, the following setting will allow the process to continue when there is a reference to a file-based external DTD in the XML document:
xf.setProperty(ACCESS_EXTERNAL_DTD, "file");
It is recommended that applications use the XPath processor to evaluate DOM rather than raw XML documents.
The logging behavior of the TLS javax.net.debug system property has been improved in this release. The javax.net.debug property is used to generate TLS debug logs from the default JSSE provider. Previously, using the ssl option via -Djavax.net.debug=ssl produced very limited output, which reduced its usefulness for troubleshooting.
With this update, setting -Djavax.net.debug=ssl now enables comprehensive SSL debug logging, except for the data, packet, and plaintext sub-options. Applications using this option will now see significantly more detailed debug information in logs.
This release also contains fixes for security vulnerabilities described in the Oracle Critical Patch Update.
➜ Issues fixed in 17.0.17:
| # | JBS | Component | Summary |
|---|---|---|---|
| 1 | JDK-8355528 | client-libs/2d | Update HarfBuzz to 11.2.0 |
| 2 | JDK-8358452 | client-libs/java.awt | JNI exception pending in Java_sun_awt_screencast_ScreencastHelper_remoteDesktopKeyImpl of screencast_pipewire.c:1214 (ID: 51119) |
| 3 | JDK-8360647 | client-libs/java.awt | [XWayland] [OL10] NumPad keys are not triggered |
| 4 | JDK-8243925 | client-libs/java.awt | Toolkit#getScreenInsets() returns wrong value on HiDPI screens (Windows) |
| 5 | JDK-8351907 | client-libs/java.awt | [XWayland] [OL10] Robot.mousePress() is delivered to wrong place |
| 6 | JDK-8185429 | client-libs/java.awt | [macos] After a modal dialog is closed, no window becomes active |
| 7 | JDK-8341311 | client-libs/javax.accessibility | [Accessibility,macOS,VoiceOver] VoiceOver announces incorrect number of items in submenu of JPopupMenu |
| 8 | JDK-8322754 | client-libs/javax.swing | click JComboBox when dialog about to close causes IllegalComponentStateException |
| 9 | JDK-8365375 | client-libs/javax.swing | Method SU3.setAcceleratorSelectionForeground assigns to acceleratorForeground |
| 10 | JDK-8348760 | client-libs/javax.swing | RadioButton is not shown if JRadioButtonMenuItem is rendered with ImageIcon in WindowsLookAndFeel |
| 11 | JDK-8243491 | core-libs | Implementation of Foreign-Memory Access API (Second Incubator) |
| 12 | JDK-8245722 | core-libs | 32-bit build failures after JDK-8243491 |
| 13 | JDK-8245455 | core-libs/java.lang.invoke | Remove alternative StringConcatFactory strategies |
| 14 | JDK-8245678 | core-libs/java.lang:reflect | Avoid allocations in Executable.getAllGenericParameterTypes |
| 15 | JDK-8319174 | core-libs/java.math | Enhance robustness of some j.m.BigInteger constructors |
| 16 | JDK-8277969 | core-libs/java.net | HttpClient SelectorManager shuts down when custom Executor rejects a task |
| 17 | JDK-8294916 | core-libs/java.net | Cancelling a request must eventually cause its response body subscriber to be unregistered |
| 18 | JDK-8335181 | core-libs/java.net | Incorrect handling of HTTP/2 GOAWAY frames in HttpClient |
| 19 | JDK-8343855 | core-libs/java.net | HTTP/2 ConnectionWindowUpdateSender may miss some unprocessed DataFrames from closed streams |
| 20 | JDK-8241389 | core-libs/java.net | URLConnection::getHeaderFields returns result inconsistent with getHeaderField/Key for FileURLConnection, FtpURLConnection |
| 21 | JDK-8358764 | core-libs/java.nio | (sc) SocketChannel.close when thread blocked in read causes connection to be reset (win) |
| 22 | JDK-8245623 | core-libs/java.nio | Remove unused code in sun/nio/fs after Solaris removal |
| 23 | JDK-8245619 | core-libs/java.nio | Remove unused methods in UnixNativeDispatcher |
| 24 | JDK-8239013 | core-libs/java.util.logging | java.util.logging.Logger catalog cache keeps strong references to ResourceBundles |
| 25 | JDK-8245677 | core-libs/java.util:collections | Optimize lookups in empty HashMaps |
| 26 | JDK-8314611 | core-libs/java.util:i18n | Provide more explicative error message parsing Currencies |
| 27 | JDK-8343804 | core-libs/java.util:i18n | Show the default time zone with -XshowSettings option |
| 28 | JDK-8353713 | core-libs/java.util:i18n | Improve Currency.getInstance exception handling |
| 29 | JDK-8368308 | core-libs/java.util:i18n | ISO 4217 Amendment 180 Update - Bulgaria Adopts the Euro in 2026 |
| 30 | JDK-8226919 | core-svc/tools | attach in linux hangs due to permission denied accessing /proc/pid/root |
| 31 | JDK-8313619 | hotspot/compiler | TestIntrinsicsRegStress.java fails on SPARC |
| 32 | JDK-8252482 | hotspot/compiler | disable cbcond instructions on SPARC64 |
| 33 | JDK-8245087 | hotspot/gc | Use ratios instead of percentages in G1HeapSizingPolicy::expansion_amount |
| 34 | JDK-8244817 | hotspot/gc | Add configuration logging similar to ZGCs to other GCs |
| 35 | JDK-8245088 | hotspot/gc | Always provide logs for G1 heap expansion calculations |
| 36 | JDK-8245086 | hotspot/gc | G1: Rename measured pause time ratios |
| 37 | JDK-8364258 | hotspot/jfr | ThreadGroup constant pool serialization is not normalized |
| 38 | JDK-8227559 | hotspot/jfr | JFR: Slow dump with path-to-gc-roots=true |
| 39 | JDK-8245120 | hotspot/jfr | JFR: Parser unable to return typed version |
| 40 | JDK-8238592 | hotspot/jfr | JFR: Crash when dumping paths to gc roots on deep heaps |
| 41 | JDK-8297106 | hotspot/runtime | Remove the -Xcheck:jni local reference capacity checking |
| 42 | JDK-8245594 | hotspot/runtime | Remove volatile-qualified member functions and parameters from oop class |
| 43 | JDK-8291763 | hotspot/runtime | Include virtualization information in hs_err crash log on Solaris |
| 44 | JDK-8245521 | hotspot/runtime | Remove STACK_BIAS |
| 45 | JDK-8243392 | hotspot/runtime | Remodel CDS/Metaspace storage reservation |
| 46 | JDK-8263407 | hotspot/runtime | SPARC64 detection fails on Athena (SPARC64-X) |
| 47 | JDK-8263004 | hotspot/runtime | SPARC CodeBuffer overflow in generate_satb_log_enqueue |
| 48 | JDK-8338154 | hotspot/test | Fix -Wzero-as-null-pointer-constant warnings in gtest framework |
| 49 | JDK-8350830 | security-libs/java.security | Values converted incorrectly when reading TLS session tickets |
| 50 | JDK-8262040 | security-libs/javax.crypto | Use ucrypto_free_context for clean operation in Solaris Ucrypto/pkcs11 |
| 51 | JDK-8296452 | security-libs/javax.crypto | Solaris Ucrypto context memory leak on CRYPTO_BUFFER_TOO_SMALL error |
| 52 | JDK-8350582 | security-libs/javax.net.ssl | Correct the parsing of the ssl value in javax.net.debug |
| 53 | JDK-8355779 | security-libs/javax.net.ssl | When no "signature_algorithms_cert" extension is present we do not apply certificate scope constraints to algorithms in "signature_algorithms" extension |
| 54 | JDK-8350807 | security-libs/javax.net.ssl | Certificates using MD5 algorithm that are disabled by default are incorrectly allowed in TLSv1.3 when re-enabled |
| 55 | JDK-8245600 | tools/launcher | Clean up libjli |