Microsoft Build of OpenJDK 2026年7月更新対象は?25.0.4・21.0.12・17.0.20・11.0.32を整理

Microsoft Build of OpenJDKの2026年7月セキュリティ更新で、更新先として確認すべきバージョンは、25.0.4、21.0.12、17.0.20、11.0.32です。現在利用しているメジャーバージョンを維持したまま、対応する最新パッチへ更新するのが基本です。たとえば、Java 21を利用しているシステムは21.0.12へ更新し、セキュリティ更新だけを目的にJava 25へ変更する必要はありません。(Microsoft for Developers)

今回の更新では、Windowsのプロセッサーグループを正しく列挙するための変更と、Windows ARM64向けの調整が含まれています。特に、論理プロセッサ数が多いWindows Serverや、ARM版WindowsでJavaを運用している場合は、通常の動作確認に加えてCPU認識数やJVMのスレッド設定も確認しておく必要があります。(Microsoft Learn)

目次

Microsoft Build of OpenJDK 2026年7月更新、必要なJDKバージョン一覧

2026年7月の更新対象と、更新後に確認すべきバージョンは次のとおりです。

利用中のJDK系統更新後のバージョン直前バージョンからの更新例Microsoft固有の主な変更
OpenJDK 2525.0.425.0.3 → 25.0.4全プロセッサーグループの列挙、Windows ARM64のスレッド取得処理最適化、Reserved Stack Areaの扱い変更
OpenJDK 2121.0.1221.0.11 → 21.0.12全プロセッサーグループの列挙、Windows ARM64でReserved Stack Areaを非対応化
OpenJDK 1717.0.2017.0.19 → 17.0.20全プロセッサーグループの列挙、Windows ARM64でReserved Stack Areaを非対応化
OpenJDK 1111.0.3211.0.31 → 11.0.32全プロセッサーグループの列挙、Windows ARM64でReserved Stack Areaを非対応化

Microsoftのダウンロードページでは、この4系統がLTSリリースとして案内されています。Windows、Linux、macOS向けにx64およびARM64版が用意され、OpenJDK 17と11にはAlpine Linux向けのx64バイナリもあります。(Microsoft Learn)

更新先は同じメジャーバージョンの最新パッチを選ぶ

今回の更新は、Javaのメジャーバージョンを移行するためのものではありません。

現在の構成が次のようになっている場合は、原則として同じ行の右側へ更新します。

現在の構成推奨する対応
Java 25を利用中25.0.4へ更新
Java 21を利用中21.0.12へ更新
Java 17を利用中17.0.20へ更新
Java 11を利用中11.0.32へ更新
Java 8を利用中Microsoft Buildではなく、Eclipse Temurin 8の更新を確認
Oracle JDKや別ベンダーのOpenJDKを利用中そのベンダーが公開する2026年7月更新を確認

たとえば、Spring BootアプリケーションをJava 17で運用している場合、まず17.0.20へ更新します。Java 21や25への移行は、フレームワーク、ライブラリ、ビルド設定、コンテナーベースイメージを含めた別の移行作業として計画するのが安全です。

2026年7月更新で変わるWindows関連のポイント

Windowsの全プロセッサーグループを列挙する変更

OpenJDK 25.0.4、21.0.12、17.0.20、11.0.32では、Windowsの「Processor Information」カウンターを利用し、すべてのプロセッサーグループに存在するプロセッサーを列挙する変更が加えられました。(Microsoft Learn)

Windowsでは、64個を超える論理プロセッサを扱うため、最大64論理プロセッサで構成される「プロセッサーグループ」という単位が使われます。64個以下の環境は通常Group 0だけですが、64個を超える大規模サーバーでは複数グループが作成されます。(Microsoft Learn)

また、「Processor Information」は、インストールされているCPUごとの情報を提供するWindowsのパフォーマンスカウンターです。今回の変更は、この情報を使って複数のプロセッサーグループを横断的に列挙するものです。(Microsoft Learn)

特に確認が必要な環境

次のような環境では、更新前後のCPU認識状況を比較してください。

  • 64個を超える論理プロセッサを搭載したWindows Server
  • 大規模なAzure VMやオンプレミスのマルチソケットサーバー
  • NUMA構成のWindowsサーバー
  • JavaのGCスレッド数やコンパイラスレッド数を自動設定に任せている環境
  • CPU数に応じてアプリケーション側のワーカースレッド数を決めているシステム
  • 性能試験の基準値を厳密に管理しているシステム

一方、論理プロセッサ数が64個以下の一般的なPCや小規模サーバーでは、この変更による目立った動作差が発生する可能性は高くありません。ただし、セキュリティ更新自体は適用対象です。

JVMの自動設定が変わっていないか確認する

プロセッサの認識数は、GCスレッド数やJITコンパイラスレッド数などの自動設定に影響する場合があります。更新前後で次のコマンドを実行し、値を比較すると判断しやすくなります。

Windows PowerShellでは、次のように確認できます。

java -XX:+PrintFlagsFinal -version 2>&1 |
  Select-String 'ActiveProcessorCount|ParallelGCThreads|ConcGCThreads|CICompilerCount'

稼働中のJVMを確認できる場合は、jcmdも利用できます。

jcmd <PID> VM.version
jcmd <PID> VM.flags
jcmd <PID> VM.command_line

更新後にスレッド数が変わった場合でも、直ちに不具合とは限りません。CPU使用率、処理件数、GC時間、レスポンスタイムを合わせて比較してください。

なお、起動オプションで次のようにCPU数を固定している場合、JVMによる自動認識の変更が表面化しない可能性があります。

-XX:ActiveProcessorCount=8

今回の変更から、大規模Windows環境ではCPU数に連動するJVM設定が変化する可能性が考えられます。ただし、すべての環境で性能が向上することを保証する変更ではありません。

Windows ARM64ではReserved Stack Areaを非対応として扱う

4つの更新バージョンすべてで、Windows ARM64上のReserved Stack Areaが非対応として扱われるようになりました。これはWindows ARM64に限定された変更であり、Windows x64やLinux、macOSでReserved Stack Areaが一律に削除されるという意味ではありません。(Microsoft Learn)

Reserved Stack Areaは、スタックオーバーフローが発生した状況でも、ロック解除などの重要な処理を完了できるように、Javaスレッドのスタック領域を一部予約する仕組みです。(OpenJDK)

通常のWebアプリケーションや業務システムで、利用者がこの機能を直接設定しているケースは多くありません。ただし、次のような環境では回帰テストを実施してください。

  • 深い再帰処理を使用するアプリケーション
  • StackOverflowError発生後の復旧処理をテストしているシステム
  • Javaエージェントやネイティブエージェントを利用している環境
  • JNIや独自ネイティブライブラリを組み込んでいるアプリケーション
  • JVM内部のスタック処理に依存する低レベルの検証ツール
  • Windows ARM64版のJDKを本番利用しているシステム

一般的なアプリケーションでは、この変更に対応するための新しいJVMオプションを追加する必要はありません。Windows ARM64環境で、スタックオーバーフロー周辺の挙動に依存している場合だけ、重点的に確認します。

OpenJDK 25だけにWindows ARM64向け最適化が追加

OpenJDK 25.0.4では、Windows ARM64向けのaarch64_get_thread_helper()が最適化されました。これはJVM内部でスレッド情報を取得するための実装レベルの変更であり、Javaアプリケーションが新しいAPIを呼び出したり、特別な設定を追加したりする必要はありません。(Microsoft Learn)

この変更はOpenJDK 25.0.4だけに記載されており、21.0.12、17.0.20、11.0.32には含まれていません。

実務上は、Windows ARM64でOpenJDK 25を利用している場合に、次の項目を確認すれば十分です。

  • アプリケーションが正常に起動するか
  • Javaエージェントが読み込まれるか
  • JNIを利用する機能が動作するか
  • 高負荷時にクラッシュや異常終了が発生しないか
  • 更新前後でスループットやCPU使用率に不自然な変化がないか

内部最適化であるため、アプリケーション全体が大幅に高速化すると断定することはできません。

OpenJDK 8は今回のMicrosoft Build更新対象ではない

OpenJDK 8は、25.0.4、21.0.12、17.0.20、11.0.32と同じ「Microsoft Build of OpenJDK」の更新対象としては掲載されていません。

Microsoftは、Java 8が必要な利用者に対して、Eclipse Adoptiumプロジェクトが提供するEclipse TemurinのOpenJDK 8ビルドを案内しています。また、Microsoft Container Registryで提供されるOpenJDK 8イメージにも、Microsoft BuildではなくEclipse Temurinのバイナリが含まれます。(Microsoft for Developers)

項目OpenJDK 11・17・21・25OpenJDK 8
JavaバイナリMicrosoft Build of OpenJDKEclipse Temurin
2026年7月の更新先11.0.32、17.0.20、21.0.12、25.0.4最新のTemurin 8を確認
単体バイナリの入手先MicrosoftのダウンロードページEclipse Adoptium
MCRイメージ内のJDKMicrosoft BuildEclipse Temurin
Microsoft Buildへの単純な置き換え同じメジャー内で可能Microsoft Build 8としては扱わない

Java 8を利用しているアプリケーションを、誤って11.0.32へ更新してはいけません。Java 8から11への変更はメジャーバージョン移行であり、ライブラリ、JVMオプション、モジュール、文字コード、TLS、GC設定などを含めた互換性検証が必要です。

OpenJDK 8で確認できるMCRタグ

2026年8月1日時点で、Microsoft Container Registryのタグ一覧から確認できるOpenJDK 8向けタグは次の3系統です。

タグ用途・状態
8-azurelinuxAzure Linux 3.0ベースとして利用する標準候補
8-distrolessAzure Linux 3.0のDistrolessイメージ
8-mariner現在は8-azurelinuxをミラーするレガシー名称
8-mariner-cm2EOLのCBL-Mariner 2.0ベース。新規利用は避ける

Microsoft Learnでは、OpenJDK 8のUbuntu 22.04向けタグは「N/A」とされており、MCRの実際のタグ一覧にも8-ubuntuは含まれていません。2026年7月の告知文ではUbuntuへの言及もありますが、Dockerfileへ記載する際は、実際に公開されているタグを基準にしてください。(Microsoft Learn)

したがって、次の記述を確認なしで使用するのは避けます。

FROM mcr.microsoft.com/openjdk/jdk:8-ubuntu

MicrosoftのレジストリからJava 8イメージを利用する場合は、次のいずれかを検討します。

FROM mcr.microsoft.com/openjdk/jdk:8-azurelinux

または、シェルやパッケージマネージャーを必要としない構成では次のタグを検討します。

FROM mcr.microsoft.com/openjdk/jdk:8-distroless

OpenJDK 8イメージのバージョン確認方法

Azure Linuxベースのイメージは、次のコマンドで取得して確認できます。

docker pull mcr.microsoft.com/openjdk/jdk:8-azurelinux

docker run --rm \
  mcr.microsoft.com/openjdk/jdk:8-azurelinux \
  java -version

Distrolessイメージでは、Javaがエントリーポイントとして設定されているため、次のように確認します。

docker pull mcr.microsoft.com/openjdk/jdk:8-distroless

docker run --rm \
  mcr.microsoft.com/openjdk/jdk:8-distroless \
  -version

Microsoftのコンテナーイメージでは、マイナーバージョンを指定したタグは提供されず、メジャーバージョンのタグがその時点の最新マイナーバージョンを指します。そのため、同じ8-azurelinuxや21-ubuntuでも、取得時期によってイメージのダイジェストやJDKのパッチバージョンが変わります。(Microsoft Learn)

再現性を重視する本番環境ではダイジェストを固定しつつ、セキュリティ更新時に新しいダイジェストへ計画的に更新する運用が適しています。

docker image inspect \
  --format='{{index .RepoDigests 0}}' \
  mcr.microsoft.com/openjdk/jdk:8-azurelinux

イメージをプルしただけでは、既存のコンテナーやPodは新しいJDKに切り替わりません。アプリケーションイメージを再ビルドし、新しいイメージまたはダイジェストで再デプロイしてください。

なお、Microsoftが提供するOpenJDKコンテナーイメージはLinuxベースです。Windowsベースのコンテナーイメージは提供されていません。Windows ARM64向けの変更は、Windows ARM64用のネイティブJDKパッケージを利用する環境の話であり、Linux ARM64コンテナーとは分けて考える必要があります。(Microsoft Learn)

自分の環境が更新対象か確認する方法

Javaの更新で最も多い失敗は、コマンドプロンプトで表示されるJavaだけを更新し、実際のサービスが別のJDKを使い続けることです。

次の対象を分けて棚卸ししてください。

確認対象見落としやすいポイント
WindowsのPATH最初に見つかったjava.exeしか確認できない
JAVA_HOMEPATHと異なるJDKを指している場合がある
Windowsサービスサービスラッパー内にJDKパスが設定されている場合がある
Tomcatやアプリケーションサーバー独自の起動スクリプトでJDKを指定している場合がある
Maven・Gradleビルド時のJDKと実行時のJDKが異なる場合がある
IDEIntelliJ IDEAやEclipseのプロジェクトJDKが別管理の場合がある
CI/CDJenkinsエージェントやGitHub Actionsのコンテナーが古い場合がある
製品同梱JRE製品フォルダー内のJavaを直接起動している場合がある
Docker・KubernetesDockerfileのタグと実際のイメージダイジェストが異なる場合がある

WindowsでJavaの場所とバージョンを確認する

PowerShellで次のコマンドを実行します。

Get-Command java -All

java -XshowSettings:properties -version 2>&1 |
  Select-String 'java.home|java.vendor|java.version'

確認するのは、バージョン番号だけではありません。

  • java.versionが対象のパッチバージョンか
  • java.vendorが想定するベンダーか
  • java.homeが実際に更新したフォルダーか
  • 複数のjava.exeがPATH上に残っていないか

Windowsサービスの実行パスを補助的に確認するには、次のコマンドを使用できます。

Get-CimInstance Win32_Service |
  Where-Object { $_.PathName -match 'java|jdk|jre' } |
  Select-Object Name, State, PathName

ただし、Apache Commons Daemon、WinSW、独自サービスラッパーなどを利用している場合、PathNameにJavaのパスが直接表示されないことがあります。サービスの設定ファイルやレジストリも確認してください。

稼働中のJavaプロセスは、次のように調べられます。

Get-CimInstance Win32_Process -Filter "Name='java.exe'" |
  Select-Object ProcessId, ExecutablePath, CommandLine

MavenとGradleが使用するJDKも確認する

ビルド環境では、ターミナル上のJavaとMaven・Gradleが利用するJavaが異なる場合があります。

mvn -version
gradle -version

出力に表示されるJava versionとJVMのパスを確認してください。

ローカル開発環境だけを更新しても、CIサーバーやビルドコンテナーが古いJDKのままでは、生成物やテスト結果が一致しません。

コンテナー内の実際のJDKを確認する

まず、稼働中のコンテナーとイメージ名を確認します。

docker ps --format 'table {{.Names}}\t{{.Image}}'

続いて、実際のコンテナー内でJavaのバージョンを確認します。

docker exec <コンテナー名> java -version

イメージ名に21-ubuntuと書かれているだけでは、現在のコンテナーが21.0.12を使っているとは限りません。コンテナーが作成された時点の古いイメージを使い続けている可能性があるため、実行中のJVMで確認することが重要です。

Microsoft Build of OpenJDKを安全に更新する手順

更新前の情報を記録する

最初に、現在の状態を記録します。

java -version

java -XshowSettings:properties -version 2>&1 |
  Select-String 'java.home|java.vendor|java.version'

あわせて、次の項目を保存してください。

  • Javaのインストール先
  • 現在のインストーラーまたはパッケージ形式
  • JAVA_HOME
  • PATHの設定
  • JVM起動オプション
  • サービスの起動アカウント
  • アプリケーションの設定ファイル
  • コンテナーの場合はイメージダイジェスト
  • 更新前のCPU使用率、メモリ使用量、GCログ

問題が発生した場合に戻せるよう、旧インストーラーや旧イメージのダイジェストも記録しておきます。

同じメジャーバージョンを更新する

WindowsでMicrosoft Build of OpenJDKを利用している場合は、現在と同じインストール方法を使うのが基本です。

Microsoftは、同じJDKメジャーバージョンに対してEXE、MSI、ZIPといった複数のインストール方法を混在させないよう案内しています。たとえば、MSIで導入したJava 21をEXEで更新する場合は、既存のMSI版を先にアンインストールする必要があります。(Microsoft Learn)

Windows Package Managerを利用している場合は、最初にパッケージを検索します。

winget search Microsoft.OpenJDK

Java 21のパッケージを更新する例は次のとおりです。

winget upgrade --id Microsoft.OpenJDK.21 --exact

利用中の系統に応じて、IDの末尾を11、17、21、25に変更します。

UbuntuやDebianでMicrosoftのリポジトリを設定済みの場合は、次のように同じメジャー系統のパッケージを更新します。

sudo apt update
sudo apt install msopenjdk-21

更新後は、既定のJavaが切り替わっているか確認します。

java -version

複数のJDKを併用している場合は、パッケージの更新だけでなく、サービスやビルドツールが参照するJDKパスも変更してください。

アプリケーションを再起動する

JDKをインストールしただけでは、すでに起動しているJavaプロセスには反映されません。Javaプロセスは起動時にJVMを読み込むため、アプリケーションやサービスの再起動が必要です。

再起動後に、稼働中のプロセスが新しいJDKを使用していることを確認します。

jcmd <PID> VM.version
jcmd <PID> VM.command_line

Windowsサービスの場合は、サービスの再起動前後でプロセスIDが変わっていることも確認してください。

更新後のテストを実施する

最低限、次のテストを実施します。

  • アプリケーションの起動と停止
  • ログインや主要画面の表示
  • データベース接続
  • HTTPSや外部APIへの接続
  • ファイル入出力
  • バッチ処理
  • スケジュールジョブ
  • Javaエージェントの読み込み
  • JNIやネイティブライブラリを利用する機能
  • メモリ使用量とGCの確認
  • CPU使用率とスレッド数の確認

今回の更新では、特に次の条件を追加してください。

環境重点確認項目
64論理プロセッサ超のWindowsCPU認識数、GCスレッド数、処理性能
Windows ARM64起動、Javaエージェント、JNI、スタック関連処理
OpenJDK 25+Windows ARM64高負荷時の安定性、スレッド関連処理
Java 8コンテナーTemurinのバージョン、ベースOS、イメージダイジェスト
Kubernetes新しいイメージがPodに反映されているか
CI/CDビルド用JDKとテスト用JDKが両方更新されているか

段階的に本番へ展開する

複数台でJavaアプリケーションを運用している場合は、一斉更新よりも段階的な展開が安全です。

最初に検証環境を更新し、その後、本番の一部ノードへ先行適用します。次の値に問題がなければ、残りのノードへ展開します。

  • エラー率
  • レスポンスタイム
  • CPU使用率
  • ヒープ使用量
  • GC停止時間
  • スレッド数
  • 外部接続の失敗数
  • JVMクラッシュやhs_err_pidファイルの有無

特にプロセッサーグループの変更が関係する大規模Windows環境では、更新前の性能値を基準として残しておくことが重要です。

更新時によくある失敗

失敗例問題点対策
java -versionだけを確認するサービスが別のJDKを利用している可能性がある稼働中プロセスの実行パスを確認する
Java 17から25へ一気に変更するセキュリティ更新とメジャー移行が混在するまず17.0.20へ更新する
Dockerイメージをプルするだけ既存コンテナーには反映されない再ビルドして再デプロイする
タグだけを記録する同じタグが後日別のイメージを指すダイジェストも記録する
Java 8イメージをMicrosoft Build 8と思い込む実際のバイナリはEclipse Temurinjava.vendorとjava.versionを確認する
8-ubuntuを前提にする現在のMCRタグ一覧に存在しない8-azurelinuxなど実在タグを確認する
Windows ARM64をx64と同じ試験だけで済ませるARM64固有変更を見落とすJNI、エージェント、スタック処理を追加確認する
EXE、MSI、ZIPを混在させるPATHやアンインストール情報が競合する同じインストール方式を継続する
開発PCだけ更新するCI/CDや本番サーバーが古いまま残る実行環境ごとに棚卸しする

2026年7月更新で今すぐ実施すべきこと

Microsoft Build of OpenJDKを利用している場合は、まずすべてのJava実行環境でjava -version、java.vendor、java.homeを確認してください。

更新先は次の4バージョンです。

  • OpenJDK 25は25.0.4
  • OpenJDK 21は21.0.12
  • OpenJDK 17は17.0.20
  • OpenJDK 11は11.0.32

Windowsで64個を超える論理プロセッサを扱う環境では、更新前後のCPU認識数とJVMスレッド設定を比較します。Windows ARM64では、Reserved Stack Areaの扱い、Javaエージェント、JNI、スタックオーバーフロー周辺の動作を重点的に確認してください。

Java 8は別扱いです。Microsoft Buildの更新対象ではなく、Eclipse Temurin 8の最新版を確認します。MCRを利用する場合は、8-azurelinuxまたは8-distrolessを候補とし、イメージを再取得するだけでなく、アプリケーションの再ビルドと再デプロイまで実施してください。

最後に、アプリケーションを再起動し、実際に稼働しているJVMが目的のバージョンへ切り替わったことを確認すれば、更新作業の完了です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次