Java 27の焦点は「新構文」だけではない
Java 27は、2026年9月15日にリリースされた非LTS(長期サポート)版です。6か月ごとのリリースサイクルに沿った今回のリリースでは、9つのJEPが提供され、そのうち4つが正式機能になりました。
注目すべき点は、目新しい言語機能だけではありません。ガベージコレクション、オブジェクトのメモリ効率、TLSの耐量子暗号対応、診断情報の機密性といった、バックエンドシステムの運用に直結する変更が含まれています。
一方で、Java 27はLTSではありません。Spring Bootなどの業務アプリケーションをすぐ全面移行するというより、性能検証や次期LTSに向けた機能評価のために導入するのが現実的です。
Java 27で正式採用された4つの変更
G1 GCがすべての環境でデフォルトに
JEP 523では、G1(Garbage-First)GCがHotSpot JVMのすべての環境でデフォルトになります。これまでは、CPUが1個以下、またはメモリが1,792MB未満の環境ではSerial GCが選択される場合がありました。
Java 27では、こうした環境でもG1が標準になります。G1はサーバー用途を中心に利用されてきましたが、これまでの改善によってSerial GCを置き換えられる性能になったという位置付けです。
実務上は、コンテナや小規模なサービスでGC方式が変わる可能性があります。特に、次のような環境ではJava 26以前との差分を確認する価値があります。
- メモリ制限を設定したコンテナ
- 小さなバッチやCLIツール
- 開発環境と本番環境でCPU・メモリ構成が異なるシステム
- 起動時間や低負荷時のメモリ使用量を重視するサービス
Serial GCの方が適しているアプリケーションでは、-XX:+UseSerialGCを明示的に指定できます。ただし、GC方式を変更する場合は、停止時間やスループットを実測して判断すべきです。
コンパクトオブジェクトヘッダーがデフォルトに
JEP 534では、64ビット環境におけるオブジェクトヘッダーのサイズが96ビットから64ビットへ縮小される、コンパクトオブジェクトヘッダーがデフォルトになります。
Java 24では実験的機能、Java 25ではオプトイン機能でしたが、Java 27では追加のコマンドラインオプションなしで利用されます。オブジェクト数が多いアプリケーションでは、ヒープ使用量の削減やデータ局所性の向上が期待できます。
効果が出やすいのは、次のようなシステムです。
- 大量の短命オブジェクトを生成するWebアプリケーション
- 大規模なキャッシュやコレクションを保持するサービス
- 多数のドメインオブジェクトをメモリ上に展開する処理
- 同じホスト上で複数のJVMを稼働させる環境
ただし、アプリケーションのメモリ使用量はオブジェクトヘッダーだけで決まるわけではありません。Java 25や26から移行する場合は、ヒープ使用量、GCログ、コンテナのRSS(Resident Set Size)を同じ条件で比較することが重要です。JetBrainsもIDE製品でこの機能によるメモリ削減を確認しています。
TLS 1.3でポスト量子ハイブリッド鍵交換に対応
JEP 527は、TLS 1.3にポスト量子ハイブリッド鍵交換アルゴリズムを導入します。
現在の暗号通信を攻撃者が記録し、将来の量子コンピューターで復号する「harvest now, decrypt later」攻撃への備えが目的です。すぐに既存の通信が量子コンピューターに破られるという話ではありませんが、長期保存される機密データを扱うシステムでは、暗号方式の移行計画が重要になります。
Java 27の導入を検討する際は、次の観点で影響を整理するとよいでしょう。
- 外部APIやデータベースとのTLS通信
- 長期間保存される個人情報・金融情報・医療情報
- 証明書や暗号スイートを明示設定しているアプリケーション
- 企業内プロキシやロードバランサーとの相互接続
JDKだけを更新すればセキュリティ対策が完了するわけではありません。通信相手やネットワーク機器との互換性も含め、検証環境で接続テストを行う必要があります。
JFRの機密情報レダクション
JEP 536では、JDK Flight Recorder(JFR)の記録がプロセス外へ出る前に、コマンドライン引数、環境変数の初期値、システムプロパティの初期値をレダクションできるようになります。
JFRは性能調査や障害解析に有用ですが、起動オプションや環境変数にトークン、接続情報、サービスの設定値が含まれていると、診断ファイルが新たな情報漏えい経路になる可能性があります。
Java 27では、JFRを本番環境の性能分析に利用する際の安全性を高めやすくなります。ただし、診断データの保管先、アクセス権限、共有手順といった運用面の対策も必要です。
プレビュー機能は本番採用ではなく評価対象
Java 27では、次の機能がプレビューとして継続しています。
- Lazy constants(3回目のプレビュー)
- プリミティブ型のパターン、
instanceof、switch(5回目のプレビュー) - Structured concurrency(7回目のプレビュー)
- PEM形式の暗号オブジェクトエンコーディング(3回目のプレビュー)
プレビュー機能は、将来の正式採用に向けて仕様やAPIが変更される可能性があります。したがって、業務システムの中核APIとして固定的に利用するより、技術検証、プロトタイプ、次期アーキテクチャの評価に適しています。
プリミティブ型を扱えるパターンマッチング
JEP 532では、switchやinstanceofなどのパターンコンテキストで、プリミティブ型を扱えるようにする機能が引き続きプレビューです。手動キャストや範囲チェックを減らし、条件分岐の意図をコードに表現しやすくします。
例えば、商品の個数に応じた割引率は次のように書けます。
int itemDiscountPercentage(int items) {
return switch (items) {
case 2 -> 5;
case 3, 4 -> 10;
case int i when i >= 5 -> 20;
default -> 0;
};
}
このコードでは、itemsが5以上の場合をガード付きパターンで表現しています。従来のif文や手動のキャストに比べて、条件と戻り値の対応関係を読み取りやすくできます。
ただし、プレビュー機能である以上、コンパイル設定や将来の仕様変更を含めて管理しなければなりません。ライブラリとして公開するコードで採用する場合は、利用者側のJDK要件を明確にする必要があります。
Structured concurrencyは並行処理の構造化を目指す
Structured concurrencyは、関連する複数のタスクをひとまとまりの処理として扱う考え方です。非同期処理の開始、完了待ち、失敗時のキャンセルといった関係がコード上で明確になり、スレッドリークやキャンセル遅延の抑制につながります。
特に、複数の外部APIを並列呼び出しして結果を集約する処理や、複数のデータソースから情報を取得するバックエンド処理で検討しやすい機能です。
一方で、既存のExecutorServiceベースの実装を一度に置き換える必要はありません。まずは次のような処理を対象に、可読性と障害時の挙動を比較するとよいでしょう。
- 複数サービスへの並列リクエスト
- タイムアウト時に関連タスクをまとめて停止する処理
- 子タスクの失敗を親処理へ伝播させる処理
- 仮想スレッドと組み合わせたI/O中心の処理
Lazy constantsとPEM API
Lazy constantsは、必要になった時点で評価される不変データを扱うための機能です。初期化コストの高い値を遅延評価することで、アプリケーションの起動時間改善につながる可能性があります。
また、PEM encodings APIは、鍵、証明書、証明書失効リストなどの暗号オブジェクトをPEM形式でエンコード・デコードするためのプレビューAPIです。暗号資材を扱うコードの標準化に役立つ可能性がありますが、Java 27でもAPIはプレビュー段階です。
Vector APIは引き続きインキュベータ
JEP 537のVector APIは、CPUが提供するベクトル命令を利用した計算をJavaコードで表現するための機能です。1回のCPUサイクルでより多くのデータを処理できる可能性があり、数値計算や画像処理などで性能向上が期待されます。
ただし、Java 27でもインキュベータ機能です。利用時には、実行時に次のモジュールを追加します。
--add-modules jdk.incubator.vector
一般的なSpring Bootの業務APIで直ちに採用する機能ではありません。大量データの変換、暗号・圧縮、画像や信号の処理など、CPU負荷が支配的な処理でベンチマークを取りながら評価するのが適しています。
IntelliJ IDEAでJava 27を使う手順
IntelliJ IDEAはJava 27をリリース初日からサポートします。基本的な設定手順は次のとおりです。
- JDK 27を用意する
Project StructureのProject Settings | Projectを開く- SDKのドロップダウンから
Download JDKを選択する - バージョンに
27を指定し、利用するベンダーを選択する - プロジェクトのLanguage levelを
27 – No new language featuresに設定する
すでにJDK 27をインストールしている場合は、Add JDK from Diskから既存のJDKを指定できます。
SDKMAN!やasdfを利用している場合は、プロジェクトの.sdkmanrcや.tool-versionsをIntelliJ IDEAが読み取り、インストール済みのJDKを自動設定できます。SDKMAN!の設定対象JDKが未インストールの場合、IDEからダウンロードを実行できる案内も表示されます。
プレビュー機能を有効にする
プレビュー機能を試す場合は、Language levelを次に変更します。
27 (Preview) – Primitive types in patterns, instanceof, and switch (5th preview)
IntelliJ IDEAは、エディター上でプレビュー機能の利用箇所を強調表示します。これにより、正式機能と実験的機能が混在しているコードでも、対象箇所を把握しやすくなります。
インキュベータ機能を実行する場合は、実行構成のModify OptionsからAdd VM Optionsを選択し、必要なモジュールオプションを追加します。
Java 25・26から移行する際のチェックポイント
Java 25やJava 26からJava 27へ移行する場合、単純なバージョンアップだけでなく、デフォルト動作の変化を確認する必要があります。
| 確認項目 | Java 27でのポイント |
|---|---|
| GC | G1 GCがすべての環境でデフォルトになる |
| オブジェクトヘッダー | コンパクトオブジェクトヘッダーがデフォルトになる |
| TLS | TLS 1.3のポスト量子ハイブリッド鍵交換に対応する |
| JFR | 機密性の高い引数・環境情報のレダクションに対応する |
| プレビューAPI | Lazy constants、構造化並行性、PEM APIなどが継続・改訂される |
| デバッガー | ステップ実行の遅さを改善する修正が含まれる |
特にGCとメモリについては、次のメトリクスを移行前後で比較すると、変更の影響を把握しやすくなります。
- コンテナやプロセスの実メモリ使用量
- ヒープ使用量とピーク値
- GCの発生回数と停止時間
- アプリケーションの起動時間
- レスポンスタイムとスループット
Java 27に含まれるデバッガーの改善はJetBrains Runtime 25にもバックポートされています。IntelliJ IDEA自体のコードをデバッグする場合や、Java 25を維持しながらデバッグ性能を改善したい場合は、対応するJBRの利用も選択肢になります。
Java 27を導入する判断基準
Java 27は、すべての本番環境が直ちに移行すべきリリースではありません。一方で、次のような目的には適しています。
- 次期LTSに向けてJDKの変更を先行評価したい
- メモリ使用量の削減効果を検証したい
- 小規模コンテナでG1 GCの挙動を確認したい
- TLSの将来的な耐量子暗号対応を検討したい
- JFRを使った本番診断の情報漏えいリスクを下げたい
- 構造化並行性やプリミティブ型パターンマッチングを試したい
- IntelliJ IDEA上で最新JDKの開発体験を確認したい
逆に、採用するライブラリや実行環境が特定のJDKバージョンに依存している場合、非LTS版への移行によって運用負荷が増える可能性があります。本番導入では、アプリケーションだけでなく、CI、コンテナイメージ、監視エージェント、APM、ミドルウェアまで含めた互換性検証が必要です。
Java 28以降への展望
Java 27の次の流れとして、Project Valhallaの成果が注目されます。Java 28では、値オブジェクトやJVMにおける厳格なフィールド初期化がプレビュー機能として対象になる予定です。これらは、オブジェクト表現やメモリ効率に関わる大きなテーマです。
Java 28 Early Access版はIntelliJ IDEAからダウンロードでき、Valhalla専用ディストリビューションを使わずに評価できます。Java 27でコンパクトオブジェクトヘッダーの効果を検証しつつ、将来の値型に向けた設計上の課題を洗い出す、という段階的な進め方も考えられます。
まとめ
Java 27の価値は、新しい構文の追加だけにありません。G1 GCの標準化、コンパクトオブジェクトヘッダー、TLS 1.3の耐量子暗号対応、JFRの機密情報レダクションは、性能・セキュリティ・運用の観点から実務に影響する変更です。
ただし、Java 27は非LTS版であり、プレビュー機能も含まれます。全面移行を急ぐのではなく、IntelliJ IDEAで開発環境を整え、代表的なサービスを対象に性能と互換性を検証するのが現実的です。
特に、メモリ使用量、GC挙動、TLS接続、JFRの診断データを移行前後で比較できれば、Java 27を採用するメリットを感覚ではなく数値で判断できます。
出典: JetBrains Blog
