Java 24の新機能と主要JEPまとめ|非LTS版の位置づけとJava 25 LTSへの移行判断
Java 24(JDK 24)は2025年3月18日にリリースされた非LTS(長期サポート対象外)のフィーチャーリリースです。無償アップデートは2025年9月で終了し、現在の長期サポート版は後継のJava 25 LTS(2025年9月16日GA)に移っています。この記事は「java 24」というバージョン固有の情報、つまりJDK 24で何が入り、どこまでが正式版でどこからがプレビューなのか、そして本番でどのバージョンを選ぶべきかを、公式のJEP番号にひもづけて整理します。
まとめ:Java 24の要点
- Java 24は非LTS。 GAは2025年3月18日、無償更新は約6か月後の2025年9月で終了。長期運用の推奨版はJava 25 LTS(2025年9月16日GA)です。
- 「Java 24 LTS」は誤り。 LTSはJava 21とJava 25。検索で「java 24 lts」と入力されがちですが、24にLTSはありません。
- 24で正式化した主な機能: Stream Gatherers(JEP 485)、Class-File API(JEP 484)、耐量子暗号ML-KEM/ML-DSA(JEP 496/497)、Security Managerの恒久無効化(JEP 486)、AOTクラスロード&リンク(JEP 483)、ZGCの非世代モード削除(JEP 490)、仮想スレッドのピン解消(JEP 491)。
- まだプレビュー(正式版ではない): プリミティブ型のパターンマッチング、モジュールインポート宣言、柔軟なコンストラクタボディ、スコープ付き値、構造化並行性。このうちスコープ付き値はJava 25で正式化されましたが、構造化並行性はJava 25時点でもプレビューが続いています。
- 採用判断: 本番・長期運用ならJava 25 LTS。Java 24は新機能を先行検証するための開発用と割り切るのが実務的です。
以下で、各機能の中身と、24を「使うべき/使うべきでない」場面を具体的に見ていきます。
Java 24の位置づけ|非LTSフィーチャーリリース
JDK 24は、Javaの半年ごとのリリースサイクルで登場した通常のフィーチャーリリースです。クラスファイル形式のバージョンは68。LTS(長期サポート)ではないため、Oracleや各ディストリビューションの無償アップデートは次リリースが出る2025年9月ごろまでの短期間に限られます。OpenJDKの無料範囲・Oracle JDKとの違い・各LTSのサポート期限は別記事で詳しくまとめています。
「java 24 lts」という検索は多いものの、24にLTSは存在しません。 LTSはJava 21(2023年9月)と、24の次にあたるJava 25(2025年9月)です。半年で無償更新が切れる非LTSを本番へそのまま採用すると、まもなくセキュリティ更新を受けられなくなります。Javaの近代化・バージョン更新を検討している場合は、24を経由地として捉え、実際の移行先はLTSに定めるのが定石です。
Java 24で正式化された主要機能
ここで挙げるものは24で正式(final)になった機能で、APIが安定しているため本番コードで使えます。
Stream Gatherers(JEP 485)による中間操作の自作
Stream APIにgather()が追加され、標準では用意されていなかった中間操作を自分で定義できます。固定長ウィンドウ分割や畳み込みなど、これまでcollect()や外部ループで書いていた処理をストリームの途中に組み込めます。
var windows = Stream.of(1, 2, 3, 4, 5)
.gather(Gatherers.windowFixed(2))
.toList();
// [[1, 2], [3, 4], [5]]
Class-File API(JEP 484)による.classの標準的な生成・変換
クラスファイルを解析・生成・変換するための標準APIが正式化されました。これまでフレームワークが内部利用していたASM等のサードパーティ製ライブラリに依存せず、JDK標準の安定APIでバイトコードを扱えます。JDK自身のバージョン更新にAPIが追従するため、バイトコード操作系ツールの保守負担が下がります。
耐量子暗号 ML-KEM/ML-DSA(JEP 496/497)の標準実装
量子計算機による解読に耐える2方式が標準ライブラリに入りました。ML-KEM(JEP 496)はNIST FIPS 203に基づく鍵カプセル化、ML-DSA(JEP 497)はFIPS 204に基づくデジタル署名です。将来のPQC移行に向けて、追加ライブラリなしで標準APIから利用できます。
Security Managerの恒久無効化(JEP 486)
長らく非推奨だったjava.lang.SecurityManagerが恒久的に無効化され、System.setSecurityManagerを呼ぶと実行時に例外になります。Security Managerに依存したサンドボックス実装は、24以降では動作しません。移行前に依存箇所の棚卸しが必要です。
AOTクラスロード&リンク(JEP 483)による起動高速化
Project Leydenの成果で、事前のトレーニング実行でロード・リンク済みのクラスをキャッシュし、次回起動時に再利用してJVMの起動時間を短縮します。ここで注意したいのは、これは起動キャッシュであって、GraalVMのようなネイティブイメージ化ではない点です。実行するのは従来どおりJVM上のバイトコードで、起動フェーズだけが速くなります。
ZGCの非世代モード削除(JEP 490)と仮想スレッドのピン解消(JEP 491)
ZGCは非世代モードが削除され、世代別モードのみになりました(世代別ZGCの導入自体はJDK 21、既定化はJDK 23で、24は旧モードを取り除く整理です)。-XX:-ZGenerationalのような旧モード向けオプションは無効になります。あわせてJEP 491で、synchronizedブロック内でも仮想スレッドがキャリアスレッドに固定(ピン)されなくなり、仮想スレッドのスケーラビリティを損なっていた代表的な問題が解消されました。ZGCの仕組みとG1GCとの違いはZGCの低遅延ガベージコレクション解説にまとめています。
Java 24のプレビュー・インキュベーター機能(正式版ではない点に注意)
次の機能は24時点でプレビューまたはインキュベーターです。--enable-previewが必要で、今後のリリースでAPIや構文が変わる可能性があるため、本番では使わない判断が無難です。「Java 24で正式に使える」と紹介している情報は誤りなので注意してください。
プリミティブ型のパターンマッチング(JEP 488・2ndプレビュー)
instanceofやswitchのパターンでintやlongなどのプリミティブ型を直接扱えるようにする提案です。switchの網羅性チェックもプリミティブに拡張されます。
Object o = 42;
if (o instanceof int i) {
System.out.println(i + 1);
}
モジュールインポート宣言(JEP 494・2ndプレビュー)
import module java.base;のように、モジュールがエクスポートする全公開パッケージを1行でまとめてインポートできます。多数のimport文を書く手間を減らす狙いですが、24時点ではまだプレビューです。
柔軟なコンストラクタボディ(JEP 492・3rdプレビュー)
super(...)やthis(...)の呼び出し前に、生成中インスタンスを参照しない前提で引数の検証や準備の文を書けるようにする提案です。従来は親コンストラクタ呼び出しを必ず先頭に置く必要がありました。
スコープ付き値(JEP 487・4thプレビュー)と構造化並行性(JEP 499・4thプレビュー)
スコープ付き値はThreadLocalに代わる不変のスレッド間データ共有、構造化並行性はStructuredTaskScopeで複数の並行サブタスクを1つの単位として扱う仕組みです。どちらも仮想スレッド前提の設計で、24ではいずれもプレビューです。 このうちスコープ付き値はJava 25(JEP 506)で正式化されましたが、構造化並行性はJava 25でも5回目のプレビュー(JEP 505)が続いており、まだ正式版ではありません。24をLTSと混同して「正式機能」と早合点しないよう気をつけてください。
Vector API(JEP 489・9thインキュベーター)
SIMD命令を活用したベクトル計算のAPIです。長年インキュベーターの段階にあり、24でも9回目のインキュベーターで、正式・安定APIではありません。パッケージもjdk.incubator.vectorのままです。
Java 24(JDK 24)の入手とインストール
JDK 24のバイナリは、OpenJDKの各ディストリビューション(Eclipse Temurin/Oracle JDK/Amazon Corretto など)から入手できます。インストール後は次で確認します。
java -version
// openjdk version "24" ... の表示になれば24が有効
ただし前述のとおり24は無償更新がすでに終了しています。これから新規に導入するなら、同じ手順でJava 25 LTSを入れるべきです。 24を入れる意味があるのは、24固有のプレビュー機能を検証環境で試したい場合に限られます。
どのJavaバージョンを採用すべきか|Java 24から25 LTSへの移行判断
バージョン選定は「LTSかどうか」を軸に決めるのが実務です。機能の目新しさで非LTSを本番投入すると、半年でサポートが切れて更新地獄になります。
| バージョン | 種別 | GA | 無償更新 | 用途の目安 |
|---|---|---|---|---|
| Java 21 | LTS | 2023-09 | 長期 | 現行の安定LTS |
| Java 24 | 非LTS | 2025-03 | 2025-09終了 | 新機能の先行検証 |
| Java 25 | LTS | 2025-09 | 長期 | 本番・長期運用の推奨 |
| Java 26 | 非LTS | 2026-03 | 2026-09予定 | 次期の先行検証 |
判断の目安は次のとおりです。本番・長期運用はJava 25 LTS一択。 24は無償更新が終わっているため、恒久運用の対象にしません。Java 21 LTSから上げる場合も、24を経由せず25 LTSへ直接移行するのが合理的です。24をあえて入れるのは、パターンマッチングやモジュールインポートなど24のプレビュー機能を開発環境で先取りして評価したいときだけです。
避けたい失敗パターンは、「java 24 lts」という検索の印象のまま24を本番採用してしまうこと。 リリース半年で無償セキュリティ更新が止まり、次のLTSへ再移行する二度手間になります。より新しい非LTSの動向はJava 26の主要JEPと全体像、24の前バージョンはJava 23の新機能の概要、フレームワーク側の対応はSpring Boot 4の変更点とJavaバージョン要件を参照してください。
よくある質問
Java 24はLTS(長期サポート)ですか?
いいえ。Java 24は非LTSのフィーチャーリリースで、無償アップデートはGA(2025年3月18日)から約6か月後の2025年9月で終了しました。LTSはJava 21とJava 25です。長期運用が必要ならJava 25 LTSを選んでください。
Java 24のサポート期限はいつまでですか?
非LTSのため、公開される無償アップデートは次リリース(Java 25)が出る2025年9月ごろまでです。それ以降にセキュリティ更新を受け続けるには、Java 25 LTSなどのサポート対象バージョンへ移行する必要があります。
Java 24とJava 21・25の違いは何ですか?
最大の違いはサポート区分で、21と25はLTS、24は非LTSです。機能面では、24でStream GatherersやClass-File API、耐量子暗号などが正式化されました。スコープ付き値・構造化並行性は24ではどちらもプレビューで、25で正式化されたのはスコープ付き値のみです(構造化並行性は25以降もプレビューが続いています)。各版のサポート期限の比較はOpenJDKのライセンス・サポート期限の記事が参考になります。
JEPとは何ですか?
JEP(JDK Enhancement Proposal)は、JDKへの機能追加や変更を管理する提案文書です。各機能にはJEP番号が振られ、Draft→Candidate→プレビュー→正式(final)と段階的に進みます。JDK 24には24件のJEPが取り込まれています(件数とバージョン番号が一致するのは偶然です)。
Java 24のスコープ付き値・構造化並行性は正式版ですか?
いいえ。JDK 24ではスコープ付き値(JEP 487)も構造化並行性(JEP 499)もどちらも4回目のプレビューで、正式版ではありません。その後スコープ付き値はJava 25(JEP 506)で正式化されましたが、構造化並行性はJava 25でもプレビュー(JEP 505)が続いています。スコープ付き値を安定して利用したい場合はJava 25以降を使ってください。