Javaのサーバーレス開発に、待望のLTSランタイムが到着しました。2026年4月30日、MicrosoftはAzure FunctionsでJava 25のGA(一般提供)対応を発表しました。Windows・Linux・Flex Consumptionプランのすべてで利用でき、Java 25が持つパフォーマンス改善やセキュリティ強化をサーバーレスアプリケーションに即座に適用できます。

この記事でわかること

  • Java 25がどのようなリリースか
  • Azure Functionsで使える主な新機能
  • 既存のJava 21プロジェクトからの移行ポイント

Java 25はどんなリリースか

Java 25は2025年9月16日にリリースされた、JDK 21以来のLTS(長期サポート)版です。18個のJEP(JDK Enhancement Proposal)を含み、そのうち7つがプレビューやインキュベーションを経てファイナライズされています。特筆すべきは、18個中9つがパフォーマンスとランタイムの改善に焦点を当てている点です。Project Leydenの成果であるAOT(事前コンパイル)関連の機能が複数入り、起動速度とスループットの両面で前世代から大きく進化しています。

メモリ効率を変えるCompact Object Headers

JEP 519として導入されたCompact Object Headersは、HotSpot JVMのオブジェクトヘッダサイズを96〜128ビットから64ビットに縮小します。Project Lilliputから生まれたこの機能は、JDK 24での実験的導入を経て、Java 25で正式な製品機能に昇格しました。

サーバーレス環境では、関数の起動ごとに多数の小さなオブジェクトが生成されます。ヘッダサイズの削減はメモリ消費の低下に直結し、Azure FunctionsのConsumptionプランのようにメモリ課金が発生する環境ではコスト削減にもつながります。

Scoped Valuesでスレッド間データ共有が安全に

JEP 506のScoped Valuesは、ThreadLocalに代わるスレッド間データ共有の仕組みです。Project Loomから生まれた機能で、不変データを安全かつ効率的に共有できます。ThreadLocalと比べて空間・時間コストが低く、仮想スレッドや構造化並行性との組み合わせで真価を発揮します。

Azure Functionsはリクエストごとにスレッドを割り当てるため、リクエストIDやユーザー情報をスレッド間で受け渡す場面は頻繁に発生します。Scoped Valuesを使えば、メモリリークのリスクなくデータを伝播できます。

Module Import Declarationsでコードが簡潔に

JEP 511のModule Import Declarationsは、モジュールがエクスポートするパッケージを一括でインポートできる構文です。たとえばimport module java.base;と書くだけで、java.utiljava.ioなどのパッケージをまとめて利用できます。

小さな関数を大量に書くサーバーレス開発では、ファイルごとのインポート文が冗長になりがちです。Module Import Declarationsはこの問題を解消し、関数コードの見通しを良くします。

AOT強化で起動速度が向上

Java 25では、JEP 514(Ahead-of-Time Command-Line Ergonomics)とJEP 515(Ahead-of-Time Method Profiling)の2つのAOT関連機能が追加されました。JDK 24で導入されたAOTクラスローディング(JEP 483)と合わせて、3段階のAOTパイプラインが完成しています。

JEP 514は、AOTキャッシュの作成に必要なコマンドを簡略化します。JEP 515は、前回の実行プロファイルをJVM起動時に即座に利用可能にし、JITコンパイラが起動直後からネイティブコードを生成できるようにします。コールドスタートが課題となるサーバーレス環境にとって、この改善は大きな意味があります。

セキュリティ面の強化

JEP 510のKey Derivation Function APIは、暗号鍵の導出に使うKDF(Key Derivation Function)のAPIを標準化したものです。HKDF、Argon2などのアルゴリズムをJava標準のAPIで利用できるようになり、サードパーティライブラリへの依存を減らせます。APIキーやトークンの管理が求められるサーバーレスアプリケーションで、セキュリティコードの記述が簡潔になります。

Azure Functionsでの利用方法

Azure FunctionsでJava 25を使うには、プロジェクトのpom.xmlでJavaバージョンを25に変更し、Azure側のランタイム設定を更新します。Maven archetypeの-DjavaVersionパラメータに25を指定すれば、新規プロジェクトの作成時からJava 25をターゲットにできます。

既存のJava 21プロジェクトからの移行では、JEP 503で32ビットx86ポートが削除されている点に注意が必要です。64ビット環境のみで動作するため、ローカル開発環境が32ビットの場合は対応が求められます。ただし、Azure Functions自体は64ビット環境で動作するため、クラウド側での影響はありません。

Java 21からの変化を整理する

Java 21からJava 25までの間に、JDK 22〜24で導入された機能も利用可能になります。代表的なものとして、JDK 22のStream Gatherers(ストリーム操作の拡張)、JDK 23のMarkdown Documentation Comments(JavadocでのMarkdown対応)、JDK 24のStream Gatherers(ファイナライズ版)などがあります。LTSからLTSへのジャンプでは、4リリース分の改善がまとめて手に入ります。

まとめに代えて

Java 25のAzure Functions GA対応は、Javaサーバーレス開発者にとって実用的なアップデートです。Compact Object Headersによるメモリ効率の改善、AOTパイプラインによる起動速度の向上、Scoped Valuesによる安全なデータ共有——いずれもサーバーレスの特性と相性が良い機能です。JDK 21のLTSサポートが続く間に、Java 25への移行を計画的に進めておくことをおすすめします。