2026年3月17日
Java 26のリリースは、JavaOne 2026の初日のキーノートセッションにおいて発表されています。
そこで、本記事ではJava 26の機能を紹介するとともに、JavaOne 2026でのトピックについてもレポートします。
Java 26の概要
OpenJDKにて開発が続けられているJavaでは、バージョンごとに取り入れられる機能をJEP
Java 26では、全体で10のJEPのうち、Standard JEPが5、残りがPreview JEPとIncubator JEPになっています。Java 26がLTSであるJava 25の次のバージョンということでJEPはそれほど多くありませんが、Standard JEPの割合が多いのが特徴的です。
Java 26のJEPを以下に示しました。
- JEP 500:Prepare to Make Final Mean Final
- JEP 504:Remove the Applet API
- JEP 516:Ahead-of-Time Object Caching with Any GC
- JEP 517:HTTP/
3 for the HTTP Client API - JEP 522:G1 GC: Improve Throughput by Reducing Synchronization
- JEP 524:PEM Encodings of Cryptographic Objects (Second Preview)
- JEP 525:Structured Concurrency (Sixth Preview)
- JEP 526:Lazy Constants (Second Preview)
- JEP 529:Vector API (Eleventh Incubator)
- JEP 530:Primitive Types in Patterns, instanceof, and switch (Fourth Preview)
Java 26では、パフォーマンスや安全性に関するStandard JEPが多くあります。そこで、本記事ではStandard JEPを中心に、各JEPを紹介していきます。
JEP 500:Prepare to Make Final Mean Final
このJEPのタイトルだけでは、どういうことなのかよくわからない方も多いのではないでしょうか。
Javaではフィールドの宣言にfinalを付加することで、フィールドへの再代入を禁止することができます。ところが、リフレクションの特殊な使い方をすることで、finalなフィールドの値を書き換えることが可能です。
しかし、これは意図しない値の書き換えによるバグの発生や、悪意のあるプログラムによる意図しない変更、改ざんなどを招く原因になってしまいます。
そこで、リフレクションによりfinalフィールドの書き換えが発生したときに、警告を出すようにするというのがJEP 500です。Java 26の段階では警告だけですが、将来的には意図しないfinalフィールドの書き換えは禁止される予定です。
ただし、実行時オプションにより、モジュールごとにfinalフィールドの書き換えを許可することや、全体の挙動を変更することも可能です。
JEP 504:Remove the Applet API
1995年にJavaが発表されたときに最も注目された機能が、ブラウザ上で動作するAppletでした。
しかし、当時のPCの性能や通信速度などの制限のために、Appletはだんだんと使われなくなっていきます。さらに、Appletを動作させるJava Plug-inにはセキュリティホールがたびたび見つかり、安全性の面からも問題視されていました。
このため、Java 11でAppletを動作させるJava Plug-inが廃止され、Appletに関連するAPIも削除予定になっていました。それが、とうとうJava 26でApplet APIが削除されました。
java.
JEP 516:Ahead-of-Time Object Caching with Any GC
Java 26ではガベージコレクション
JEP 516は、Javaの起動時間やピークパフォーマンスに達するまでの時間を短縮することを目的としたProject Leydenに関連したJEPです。
Project Leydenではロードされたクラスや最適化のためのプロファイル情報などをキャッシュファイルに保存しておき、起動時にそのキャッシュファイルを使うことで起動時間などを短縮する機能を提供しています。このキャッシュはAOTキャッシュと呼ばれています。
JEP 516では、AOTキャッシュに初期化済みのオブジェクトをGCに依存しない形式で保存し、実行時にロードすることを可能としています。
また、これによって起動時間やピークパフォーマンスに達するまでの時間を短縮するために、GCとAOTキャッシュとの連携を可能としています。
JEP 522:G1 GC: Improve Throughput by Reducing Synchronization
もう1つのGCに関するJEPがJEP 522です。
G1GCは世代別GCを採用しています。世代別GCでは、ヒープをヤング領域とオールド領域に分けて管理しますが、G1GCでは事前にヒープを一定サイズの領域に分割し、ダイナミックにヤング領域とオールド領域を割り当てて使用します。
このため、ヒープ上のオブジェクトが別の領域に移動することがあります。オブジェクトの参照先の変更を管理するために、テーブルを使用しています。しかし、テーブルに対して読み込みと書き込みが同時に発生するため同期処理を必要とします。このため、スループットが低下することがありました。
JEP 522では、この同期処理を低減させることでスループットの向上を図っています。
JEP 517:HTTP/3 for the HTTP Client API
JavaではHTTP通信を行うクライアントAPIとしてHTTP Client APIを提供しています。このHTTP Client APIがHTTP/
使用方法はとても簡単です。HttpClientオブジェクトを作成するときにバージョンを指定するだけです。
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_3)
.build();
HttpClientオブジェクトのビルダークラスであるHttpClient.
HttpClientオブジェクトが生成できれば、後は従来の使い方と変更はありません。ただし、実際にHTTP/
Preview JEPとIncubator JEP
お試し機能であるPreview JEPとIncubator JEPについても簡単に紹介しておきます。
JEP 524:PEM Encodings of Cryptographic Objects (Second Preview)
JEP 524では、暗号鍵、証明書などをPrivate-Enhanced Mail形式で扱うことを目的としています。PEM形式のエンコード、およびデコードを行うAPIを提供しますが、Java 25からの変更点も多いため、正式なJEPになるにはもう少し時間がかかりそうです。
JEP 525:Structured Concurrency (Sixth Preview)
複数スレッドでの処理の結果をまとめるような場合に便利なのがStructured Concurrencyです。すべての処理が完了するまで待機することなど従来でも記述することは可能ですが、Structured Concurrencyを使うことで簡潔にしかも安全に行うことができます。
JEP 526:Lazy Constants (Second Preview)
Lazy Constantsはクラスのfinalフィールドを安全に遅延初期化するためのAPIです。Java 25ではStable Valueでしたが、名称が変更され、使い方もシンプルになっています。
JEP 530:Primitive Types in Patterns, instanceof, and switch (Fourth Preview)
パターンマッチングにプリミティブ型を使えるようにするのが、JEP 530です。switch式ではプリミティブ型の値と型の両方をcaseに使用できるという複雑性のためなかなか正式の機能にはなりませんが、Java 26では正確性の定義を強化するなどの変更が加えられています。
JEP 529:Vector API (Eleventh Incubator)
1つの命令で複数のデータをまとめて演算するためのSIMD命令に対応するのがVector APIです。Vector APIはProject ValhallaのValue Classが導入されるまで、Incubatorのまま継続されることになっています。
Java 26のまとめ
Java 26はLTSの次のバージョンということもあり、比較的小規模の変更が主でした。
しかし、Javaを安定して使うために欠かせない、安全性やパフォーマンスなど地味ではあるものの重要な機能が導入されています。また、次のLTSに向けて、プリミティブ型のパターンマッチングなどの準備も着々と進められています。
1つ1つのJavaのバージョンの機能を見ていくことも重要ですが、複数のバージョンを俯瞰することによって、今後のJavaの流れも理解しやすくなるはずです。
JavaOne 2026
Oracleが開催するJavaの開発者会議がJavaOneです。今年は3月17日から3日間にわたって開催されました。JavaOneの会場は、昨年からレッドウッドにあるOracle旧本社のOracle Conference Centerとなっています。
JavaOneの第1回は1996年。コロナで開催できなかった年もありますが、今年で25回目の開催です。
今年のJavaOneは、3種類のキーノートセッションと、多くの技術セッションから構成されました。本記事では、JavaOneのトピックを2つ紹介していきます。
現在のJavaはOpenJDKで開発がオープンに進められているため、JavaOneで初めて公開される技術的なトピックというのはほぼありません。しかし、それでもJavaOneなどのカンファレンスで発表されることで、大きな話題になることはあります。
今年のJavaOneでそれに当たるのが、Project Detroitでした。
そして、もう1つのトピックがProject Babylonです。
Project Detroit
Project Detroitは、Javaから他の言語を使用可能にするスクリプトエンジンを提供していくプロジェクトです。
Project Detroitは2018年に開始されたのですが、活動が停滞していました。そこで、JavaOne 2026でProject Detroitを再始動することが発表されました。
Javaから他の言語を使用するというと、JavaScriptのNashorn、PythonのGraalPyなどが思い浮かびます。
これらのエンジンはJVM上で動作する言語の実行系ですが、保守していくことはなかなか大変です。このため、NashornはJDKから削除されてしまいました。
Project Detroitは今までのJVM上で作成された言語実行系とは異なり、既存の言語実行系とJavaの世界をつなぐブリッジとして提供されます。スクリプトエンジンは言語ごとに異なりますが、Javaから他言語を使うにはJava 6で導入されたScriptEngineインターフェースがそのまま使用できます。
ScriptEngineインターフェースを使用することで、スクリプトを1行単位で評価することや、JavaScriptであればコールバック関数にJavaのメソッドを指定することもできます。
まずは、JavaScriptのV8、PythonのCPythonをサポートしていくことが発表され、GitHubでソースコードも公開されています。
Project Babylon
Project BabylonはJavaのコードの一部をJVMで動作するバイトコードではなく、他の方法で実行することを目指したプロジェクトです。現在は、まずGPUをターゲットに進められています。
Project Babylonは2024年のJVM Language Summitで発表されたプロジェクトです。発表当時はコンセプトだけの部分も多かったのですが、徐々に具体的な形が見えてきました。
JavaOne 2026では多くの技術セッションが行われました。その中には、Oracleのスピーカによるセッションだけでなく、NVIDIAのスピーカによるセッションなどもあります。
機械学習などの演算を実行するには、GPUが欠かせません。しかし、これまではJavaとGPUの親和性はそれほど高くありません。Project Babylonを使用することで、指定した演算処理をGPUで実行することが可能になります。
実際にProject Babylonが正式な機能になるまでには、まだ時間がかかりそうですが、注目に値するプロジェクトです。
おわりに
JavaOne 2026にて発表されたJava 26のリリースを中心に、その他のJavaOneのトピックも合わせて紹介してきました。
Java 26は安全性やパフォーマンス向上に向けた機能が取り入れられています。LTSの次のバージョンということで、導入された機能は比較的少ないものの、Javaを使っていく上で欠かせない機能となっています。
また、JavaOneでは、今後のJavaの方向性として他言語やGPUとの親和性を高めていくというトピックが大きな話題になりました。
2000年代初頭のJavaOneと比較すると、今年のJavaOneはかなり規模が小さくなっています。しかし、実際にJavaを作っている開発者たちの講演を直接聴講できる貴重な機会です。
また、NetflixやUberなどの事例セッションも人気セッションとなっていました。
JavaOneの主なセッションは今後YouTubeのJavaチャンネルで公開される予定です。もし気になるセッションがありましたら、ぜひチェックしてみてください。