JDK 25 JEP 以外の変更点まとめ

blog1.mammb.com

JDK25 の JEP 以外の変更点まとめです。 JEP 機能についてはコチラを参照してください。


主な新機能

java.io.Reader から残りの文字をすべて読み取るサポート(JDK-8354724)

java.io.Reader クラスに、残りのすべての文字を読み取るための新しいメソッドが追加された。

  • Reader.readAllAsString() は、残りのすべての文字を String として読み取る
  • Reader.readAllLines() は、残りのすべての文字を List<String> として読み取る

標準システムプロパティ stdin.encoding の追加(JDK-8350703)

新しいシステムプロパティ stdin.encoding が追加された。 このプロパティには、InputStreamReader や Scanner などを使用して System.in から文字データを読み取る際に推奨される文字セット名が設定される。

デフォルトでは、OS とユーザー環境の照会に基づいてシステム固有の方法で設定される(file.encoding プロパティの値、デフォルトの文字セット、および Native.encoding プロパティの値と異なる場合がある)。

stdin.encoding の値は、コマンドラインで引数 -Dstdin.encoding=UTF-8 のようにオーバーライドできる。

CharSequence と CharBuffer の新しい getChars(int, int, char[], int) メソッド(JDK-8343110)

java.lang.CharSequencejava.nio.CharBuffergetChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) が追加された(StringStringBuilderCharBufferCharSequence を実装している)。

このメソッドは、char[] に文字を一括読み込むため、シーケンスから一括読み込みを行う際に、特別な処理や String へのキャストが必要がなくなった。

接続を識別するための java.net.http.HttpResponse の新しい connectionLabel メソッド(JDK-8350279)

java.net.http.HttpResponse に新しい connectionLabel メソッドが追加された。

このメソッドは、呼び出し元がレスポンスとそれが実行される接続を関連付けるために使用できる接続ラベルを返す。 2 つのリクエストが同じ接続で実行されたのか、それとも異なる接続で実行されたのかを判断するのに利用できる。

HttpClient が受け入れるレスポンス本文のバイト数を制限するための BodyHandlers と BodySubscribers の新しいメソッド(JDK-8328919)

HttpClient API に、java.net.http.HttpResponse.BodyHandlers.limiting(...)java.net.http.HttpResponse.BodySubsribers.limiting(...)の 2 つのメソッドが追加された。

これらのメソッドは既存の BodyHandler または BodySubscriber を拡張し、アプリケーションが HTTP リクエストへのレスポンスとして受け入れ可能なレスポンスボディのバイト数を制限する機能を提供する。

これにより、アプリケーションはサーバーから受け入れ可能な最大バイト数を制御できるようになった。

ZIP FileSystem を読み取り専用として構築するための新しいプロパティ(JDK-8350880)

ZIP FileSystem を作成する際、プロパティ名「accessMode」に「readOnly」または「readWrite」の値を指定して、必要なモードを指定できるようになった。

これにより ZIP FileSystem を読み取り専用または読み書き可能なファイルシステムとして作成できるようになった。

読み取り専用ファイルシステムを作成する例は以下。

FileSystem zipfs = FileSystems.newFileSystem(pathToZipFile, Map.of("accessMode","readOnly"));

ForkJoinPool と CompletableFuture のアップデート(JDK-8319447)

java.util.concurrent.ForkJoinPool が更新され、ScheduledExecutorService が実装された。 この API 更新により、タイムアウト処理に遅延タスクが使用され、ほとんどのタイムアウトがキャンセルされるネットワークアプリケーションやその他のアプリケーションにおける遅延タスク処理のパフォーマンスが向上する。

ScheduledExecutorService で定義されているスケジュールメソッドに加えて、ForkJoinPool では、タスクが完了する前にタイムアウトが経過した場合にキャンセルされる(またはその他のアクションが実行される)タスクを送信するための新しいメソッド submitWithTimeout が定義された。

この更新の一環として、CompletableFutureSubmissionPublisher が変更され、明示的な Executor のないすべての非同期メソッドが ForkJoinPool 共通プールを使用して実行されるようになった(これは、ForkJoinPool 共通プールの並列度が 2 未満に設定されていた場合に、非同期タスクごとに新しいスレッドが作成されていた以前のリリースとは異なる)。

UseCompactObjectHeaders が Product オプションとなった(JDK-8350457)

-XX:+/-UseCompactObjectHeaders が Product オプションになり、-XX:+UnlockExperimentalVMOptions フラグを使用せずにコンパクトオブジェクトヘッダーを有効にできるようになった(コンパクトオブジェクトヘッダーは、JEP 450 に基づいて JDK 24 で導入された機能で、このリリースではデフォルトで無効)。

コンパクトオブジェクトヘッダーの使用をサポートするために、JDK イメージ用の 2 つの CDS アーカイブ (classes_coh.jsaclasses_nocoops_coh.jsa) が追加された。


その他の変更点

  • StringBuilder および StringBuffer クラスの substring、subSequence、toString が毎回新しいStringインスタンスを返すという仕様が緩和された(JDK-8138614)
  • java.util.zip.Inflater と java.util.zip.Deflater が AutoCloseable を実装するように拡張された(JDK-8225763)
  • java.io.File が空のパス名を現在のユーザーディレクトリとして扱うようになった (JDK-8024695)
  • BigDecimal.sqrt() メソッドが 100 の累乗や大きな精度で例外をスローするようになった (JDK-8341402)
  • Windows で、スペースで終わるディレクトリ名またはファイル名によるファイル操作が常に失敗するようになった (JDK-8354450)
  • Windows で File.delete の動作が変更され、DOS 読み取り専用属性が設定されている通常のファイルに対しては削除に失敗し false を返すようになった。(JDK-8355954)
    • 従来の動作を復元するには、システムプロパティ -Djdk.io.File.allowDeleteReadOnlyFiles=true を指定
  • java.net.http.HttpClient が禁止されたヘッダーを含む応答を拒否するようになった(JDK-8354276)
  • CodeModel が CustomAttribute と UnknownAttribute を提供するようになった (JDK-8347472)
  • Calendar.ERA フィールド値が大きすぎる場合の和暦例外の変更 (JDK-8350646)

  • 画像処理アプリケーションのカラー管理で使用される ICC_Profile インスタンスはカプセル化する生のカラープロファイルデータを変更することを許可していたが、これが禁止された(JDK-8346465)

  • システム全体のデフォルト非同期チャネルグループに対するデフォルトのスレッドプールが変更され、非同期I/O操作を開始するスレッドから何も継承しないスレッドが生成されるようになった(JDK-8345432)
  • 非ローカルファイル URL に対する FTP フォールバックがデフォルトで無効になった(JDK-8353440)
  • jwebserver ツールの -d コマンドラインオプションで、相対パスで指定されたディレクトリも指定できるようになった(JDK-8355360)
  • jdk.includeInExceptions セキュリティおよびシステムプロパティの使用範囲が拡大され、より多くの設定可能なカテゴリが追加された(JDK-8348986)
  • XMLStreamReader のエラー処理修正 (JDK-8327378)
  • XPath APIにおける拡張関数の制限削除(JDK-8354084)
  • JVMTI ClassFileLoadHook イベントで提供されるクラスファイルが検証されるようになった(JDK-8351654)
  • BasicSliderUI() の引数なしコンストラクタを削除 (JDK-8334581)
  • Debian ベース Linux におけるデフォルトのタイムゾーン検出の変更 (JDK-8345213)
  • CLDR バージョン 47 のサポート (JDK-8346948)
  • OCSP の readtimeout プロパティと OCSP タイムアウトの互換性が向上 (JDK-8347506)

  • javac コンパイラは、ラムダ式の型としてクラスを許可しなくなった(JDK-8322810)

  • javac は2つのUTF-16サロゲート文字で構成される文字リテラルを検出した場合、コンパイル時エラーを生成するようになった(JDK-8354908)
  • 内部クラスのコンストラクタ内部で、Immediately Enclosing Instance の null チェックを追加(JDK-8164714)
  • 特定の条件下で javac がクラスパス上のjarファイルまたはzipファイルへクラスファイルの書き込みを行うことがなくなった(JDK-8338675)
  • デフォルトのコンソール実装が JLine から java.base のビルトインモジュールに変更された (JDK-8351435)
  • -Xprint オプションの出力に、型変数の境界と注釈付きオブジェクトのスーパータイプを含むようになった(JDK-8356057)
  • Xlint:none コンパイラフラグは -nowarn を暗黙的に指定しなくなった (JDK-8352612)
  • x86_64 プラットフォーム上で MontgomeryIntegerPolynomialP256 演算にAVX2命令を用いた最適化された組み込み関数を提供(JDK-8350459)
  • JVMTI 関数 NotifyFramePop は、指定された深さで既にFramePopイベントが要求されている場合に、JVMTI_ERROR_DUPLICATEを返すようになった(JDK-8346460)
  • jcmd の GC.heap_info の一部であったメタスペースに関する情報は vm.metaspace に移動された(JDK-8356848)
  • HotSpotDiagnosticMXBean.dumpThreads および jcmd Thread.dump_to_file によって生成されるスレッドダンプにロック情報が含まれるようになった(JDK-8356870)
  • JFR 用のコンテキスト情報取得用の @Contextual アノテーション追加(JDK-8356698)
  • JFR のソケット、ファイル、および例外イベントがデフォルトで抑制されました (JDK-8351594)
  • jar --validate コマンドの強化(JDK-8345431)
  • JarEntry および JarURLConnection の getCertificates メソッドと getCodeSigners メソッドに、署名者の検証に関する API ノートを追加(JDK-8347946)
  • jpackage は、生成された実行時イメージに対してデフォルトでサービスバインディングを含まなくなった (JDK-8345185)
    • 以前の動作を実現するには、jpackage が使用するデフォルトの jlink オプションに --bind-services オプションを指定
  • JarInputStreamクラスは、JARファイルの最初の2エントリ内に2つ目のマニフェストを検出した場合、署名付きJARを署名なしとして扱うようになった(JDK-8337494 (not public))

  • G1 GC で、領域を共有カードセットにグループ化することで、記憶済みセットのオーバーヘッドを削減(JDK-8343782)

  • ZGC で短命な文字列の重複排除をスキップするようになった (JDK-8347337)
  • G1 GC で領域選択の改善により停止時間の急増を削減 (JDK-8351405)
  • ZGC で仮想アドレス空間の断片化への対応が強化された(JDK-8350441)
  • Serial/Parallel GC における JNI による OutOfMemoryError の解消 (JDK-8192647)

  • JavaDoc は、従来のドキュメントコメントにおいて行頭にある共通のインデントを削除するようになった(JDK-8352249)

  • JavaDoc コードフラグメントの構文ハイライト追加 (JDK-8348282)
    • --syntax-highlight オプションで有効化
  • JavaDoc で条件付きエクスポートパッケージのスーパークラスが非表示となった (JDK-8254622)
  • JavaDoc APIドキュメントにキーボードナビゲーションを追加

  • MessageDigest アルゴリズムに SHAKE128-256 と SHAKE256-512 追加(JDK-8354305)

  • SunPKCS11 における HKDF のサポート追加(JDK-8328119)
  • JavaのXMLセキュリティを3.0.5に更新(JDK-8344137)
  • TLSスコープに基づいて署名スキームを無効にするメカニズム(JDK-8349583)
  • java.security.debug のタイムスタンプとスレッドの詳細をデフォルトでオンにする(JDK-8350689)
  • JSSE および SunJSSE プロバイダに TLS キーマテリアル エクスポーターのサポートを追加(JDK-8341346)
  • TLS/DTLS 1.2 ハンドシェイク署名で SHA-1 を無効化 (JDK-8340321)
  • 実装要件に TLSv1.3 および CNSA 1.0 アルゴリズムが追加された (JDK-8283795)
  • ML-KEM のパフォーマンスが向上した (JDK-8351412、JDK-8349721、 JDK-8351412)
  • ML-DSA のパフォーマンス向上 (JDK-8351034、JDK-8348561、JDK-8351034)
  • SunJCE プロバイダの PBE 関連 SecretKeyFactory 実装が Unicode サポートで拡張された (JDK-8348732)
  • Camerfirma Root CA によりアンカーされたTLS サーバー証明書(2025年4月15日以降に発行)を信頼しない(JDK-8346587)
  • Sectigo Limited の新しいルート証明書を 4 つ追加 (JDK-8359170)


削除・非推奨化

  • 有効期限が切れた Baltimore CyberTrust ルート証明書を削除(JDK-8303770)
  • java.net.Socket コンストラクタはデータグラムソケットの作成に使用できなくなった(JDK-8356154)
  • 古い JMX システムプロパティを削除(JDK-8344966, JDK-8344969, JDK-8344976, JDK-8345045, JDK-8345048, JDK-8345049)
  • PerfData の定期的なサンプリング機能の削除(JDK-8241678)
  • sun.rt._sync* のパフォーマンスカウンタの削除(JDK-8348829)
  • 2つの Camerfirma ルート証明書の削除(JDK-8350498)
  • SunPKCS11 プロバイダの PBE 関連の SecretKeyFactory 実装の削除(JDK-8348732)

  • jdk.lang.Process.launchMechanism=VFORK オプションの非推奨化(linux) (JDK-8357179)

  • java.locale.useOldISOCodes システムプロパティの非推奨化(JDK-8353118)
  • JMX DescriptorSupport における XML 交換の非推奨化(JDK-8347433)
  • UseCompressedClassPointers オプションの非推奨化(JDK-8350753)
  • さまざまな権限クラスの非推奨化(JDK-8348967, JDK-8353641, JDK-8353642, JDK-8353856, JDK-8347985, JDK-8351224, JDK-83513)