JDK 24リリースにおける重要な変更

JDK 24の新機能と拡張機能、およびAPI仕様の詳細は、JDK 24リリース・ノートを参照してください。

Java SE 24およびJDK 24の更新内容の一部を次に示します:

言語プレビュー機能

  • パターン・マッチングが拡張され、すべてのパターン・コンテキストでプリミティブ型を使用できるようになりました。instanceof演算子とswitch式および文は、すべてのプリミティブ型で機能するように拡張されています。

    この機能はJava SE 23で初めてプレビューされ、今回のリリースで再プレビューされました。Java SE 23とこのリリースの間では変更されていません。

    JEP 488: パターン、instanceofおよびswitchのプリミティブ型(第2プレビュー)および『Java Platform, Standard Edition Java言語更新』の次の項を参照してください:

  • モジュール・インポート宣言では、モジュールによってエクスポートされたすべてのパッケージを簡潔にインポートできます。これにより、インポート・コードをモジュール自体に含める必要がなく、モジュラ・ライブラリの再利用が容易になります。
    この機能はJava SE 23で初めてプレビューされ、今回のリリースで再プレビューされました。このリリースでは:
    • オンデマンド型インポート宣言は、モジュール・インポート宣言より優先されます。
    • モジュールは、java.baseモジュールへの推移的な依存を宣言できます。
    • java.seモジュールには、java.baseモジュールが推移的に必要です。したがって、java.seモジュールをインポートすると、Java SE API全体がインポートされます。

    JEP 494: モジュール・インポート宣言(第2プレビュー)および『Java Platform, Standard Edition Java言語更新』モジュール・インポート宣言に関する項を参照してください。

  • 柔軟なコンストラクタ本体を使用すると、コンストラクタ内の文を、super(..)this(..)などの明示的なコンストラクタ呼出しの前に指定できます。これらの文は作成中のインスタンスを参照できませんが、フィールドを初期化できます。別のコンストラクタを呼び出す前にフィールドを初期化することで、メソッドがオーバーライドされた場合でもクラスの信頼性が向上します。

    Java SE 22で最初にJEP 447: super(...)の前の文(プレビュー)としてプレビューされ、Java SE 23でJEP 482: 柔軟なコンストラクタ本体(第2プレビュー)として再度プレビューされました。この機能は、今回のリリースでも大きな変更なく再プレビューされます。

    JEP 492: 柔軟なコンストラクタ本体(第3プレビュー)および『Java Platform, Standard Edition Java言語更新』柔軟なコンストラクタ本体に関する項を参照してください。

  • 単純なソース・ファイルとインスタンスのメイン・メソッドを使用すると、初心者は、大規模なプログラム用に設計された言語機能を理解することなく、最初のプログラムを記述できます。初心者は、言語の別の方言を使用するかわりに、単一クラス・プログラムの合理化された宣言を記述し、スキルの向上に合せてより高度な機能を使用するようにプログラムをシームレスに拡張できます。経験豊富な開発者も同様に、大規模なプログラミングのための構造を必要とせずに、小規模なプログラムを簡潔に記述できます。

    Java SE 21で最初にJEP 445: 無名クラスおよびインスタンスのmainメソッド(プレビュー)としてプレビューされ、Java SE 23で再度プレビューされました。この機能は、新しい用語と改訂されたタイトルで今回のリリースで再プレビューされましたが、それ以外は変更ありません。

    JEP 495: 単純なソース・ファイルおよびインスタンスのメイン・メソッド(第4プレビュー)および『Java Platform, Standard Edition Java言語更新』単純なソース・ファイルおよびインスタンスのメイン・メソッドに関する項を参照してください。

JEP 12: プレビュー機能に関する項および『Java Platform, Standard Edition Java言語更新』プレビュー言語およびVM機能に関する項を参照してください。

パフォーマンスとランタイムの改善

  • HotSpot JVMのオブジェクト・ヘッダーのサイズは、64ビット・アーキテクチャで96ビットと128ビットから64ビットに削減されました。これにより、ヒープ・サイズが削減され、デプロイメントの密度が向上し、データの局所性が向上します。これは実験的な機能であり、コマンドライン・オプションを渡すことで有効にできます:
    +UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders

    JEP 450: コンパクト・オブジェクト・ヘッダー(実験的)を参照してください。

  • アプリケーション・メモリー・アクセスに関する情報を記録するG1ガベージ・コレクタのバリアの実装が簡略化され、その展開がC2 JITのコンパイル・パイプラインの初期段階から後期に移動されました。

    JEP 475: G1の遅延バリア展開を参照してください。

  • 事前クラス・ローディングおよびリンクにより、HotSpot Java仮想マシンの起動時に、アプリケーションのクラスがロードおよびリンクされた状態で即時に使用可能になるため、起動時間が改善されます。これは、1回の実行中にアプリケーションをモニターし、後続の実行のためにロード済およびリンク済の形式のすべてのクラスをキャッシュに格納することによって実現されます。

    JEP 483: 事前クラス・ローディングおよびリンクを参照してください

  • ZGCガベージ・コレクタは、デフォルトで世代別モードで実行されます。ZGCの非世代別モードは削除されました。

    JEP 490: ZGC: 非世代別モードの削除および『Java Platform, Standard Edition HotSpot仮想マシン・ガベージ・コレクション・チューニング・ガイド』Zガベージ・コレクタに関する項を参照してください。

  • ピンニングなしで仮想スレッドを同期すると、synchronizedメソッドおよび文を使用するJavaコードのスケーラビリティが向上します。これは、そのような構造でブロックする仮想スレッドが、その基盤となるプラットフォーム・スレッドを他の仮想スレッドが使用できるように解放するように調整することで実現されます。

    JEP 491: ピンニングなしで仮想スレッドを同期を参照してください。

ライブラリの改善、プレビュー、およびインキュベータ

  • クラス・ファイルAPIは、Javaクラス・ファイルの解析、生成および変換のための標準APIです。

    JEP 484: クラス・ファイルAPIおよび『Java Platform, Standard Edition Java仮想マシン・ガイド』クラス・ファイルAPIに関する項を参照してください。

  • Stream Gatherersを使用すると、カスタム中間操作を作成できます。これにより、ストリーム・パイプラインは、既存の組込み中間操作では容易には実現できない方法でデータを変換できるようになります。

    JEP 485: Stream Gatherersおよび『Java Platform, Standard Editionコア・ライブラリ』Stream Gatherersに関する項を参照してください。

  • 構造化並行性は、並行プログラミングを簡素化するAPIです。異なるスレッドで実行されている関連タスクのグループを1つの作業単位として処理することにより、エラーの処理と取消しを効率化し、信頼性と可観測性を向上させます。

    JEP 499: 構造化並行性(第4プレビュー)および『Java Platform, Standard Editionコア・ライブラリ』構造化並行性に関する項を参照してください。

  • スコープ値を使用すると、メソッドで不変データをスレッド内のそのコール先と子スレッドの両方と共有できます。スレッドローカル変数よりも扱いやすいです。また、特に仮想スレッドおよび構造化並行性とともに使用する場合、領域および時間のコストも低くなります。

    JEP 487: スコープ値(第4プレビュー)およびJava API仕様のScopedValueクラスを参照してください。

  • ベクターAPIは、実行時に、サポートされているCPUアーキテクチャ上で最適なベクトル命令に確実にコンパイルするベクトル計算を表現します。これにより、同等のスカラー計算よりも優れたパフォーマンスを実現できます。

    JEP 489: ベクターAPI(第9インキュベータ)およびJEP 11: インキュベータ・モジュールを参照してください。

セキュリティ・ライブラリ
  • キー導出関数(KDF)にAPIが導入されました。KDFは、秘密キーやその他のデータから追加のキーを導出するための暗号化アルゴリズムです。これはプレビューAPIです。

    JEP 478: キー導出関数API(プレビュー)および『Java Platform, Standard Editionセキュリティ開発者ガイド』KDFクラスに関する項を参照してください。

  • Javaアプリケーションのセキュリティは、量子耐性モジュール格子ベースのキーカプセル化メカニズム(ML-KEM)の実装を提供することで強化されます。キー・カプセル化メカニズム(KEM)は、公開キー暗号化を使用して、セキュアでない通信チャネルで対称キーを保護するために使用されます。

    JEP 496: 量子耐性モジュール格子ベースのキー・カプセル化メカニズムを参照してください。

  • Javaアプリケーションのセキュリティは、量子耐性モジュール格子ベースのデジタル署名アルゴリズム(ML-DSA)の実装を提供することで強化されます。デジタル署名は、データに対する不正な変更を検出し、署名者の身元を認証するために使用されます。

    JEP 497: 量子耐性モジュール格子ベースのデジタル署名アルゴリズムを参照してください。

削除および将来の変更に関する警告

  • JNIの使用を制限する準備: Java Native Interface (JNI)の使用に関する警告が発行され、外部関数およびメモリー(FFM) APIが一貫した方法で警告を発行するように調整されます。このような警告はすべて、JNIおよびFFM APIを統一的に制限することで、デフォルトで整合性を確保する将来のリリースに向けて開発者が準備できるようにすることを目的としています。

    JEP 472: JNIの使用を制限する準備およびネイティブ・コードへのアクセスに対する制限および警告に関する項を参照してください。

  • セキュリティ・マネージャの永続的な無効化: セキュリティ・マネージャが永続的に無効化され、セキュリティ・マネージャAPIは将来のリリースで削除されます。

    JEP 486: セキュリティ・マネージャの永続的な無効化および『Java Platform, Standard Editionセキュリティ開発者ガイド』セキュリティ・マネージャの永続的な無効化に関する項を参照してください。

  • ZGC: 非世代別モードの削除: ZGCガベージ・コレクタは、デフォルトで世代別モードで実行されます。ZGCの非世代別モードは削除されました。

    JEP 490: ZGC: 非世代別モードの削除および『Java Platform, Standard Edition HotSpot仮想マシン・ガベージ・コレクション・チューニング・ガイド』Zガベージ・コレクタに関する項を参照してください。

  • sun.misc.Unsafeでのメモリー・アクセス・メソッドの使用時に警告: sun.misc.Unsafeのメモリー・アクセス・メソッドが最初に呼び出された際、実行時に警告が発行されます。これらのサポートされていないメソッドはすべて、JDK 23で最終的に非推奨になりました。標準APIであるVarHandle APIおよび外部関数およびメモリーAPIに置き換えられています。

    JEP 498: sun.misc.Unsafeでのメモリー・アクセス・メソッドの使用時の警告を参照してください。

削除および非推奨の詳細は、「JDK 24で削除および非推奨となった機能およびオプション」を参照してください。

また、注意が必要なセキュリティ関連の更新もあります。「JDK 24でのセキュリティ・アップデート」を参照してください。