原文はこちら。
The original article was written by Billy Korando (Developer Advocate, Java Platform Group, Oracle).
https://inside.java/2026/09/12/jdk-27-runtime-updates/
JDKのリリースでは、言語やAPIの変更が注目されがちですが、JDK 27には、基盤となるランタイムに対する数多くの変更も含まれています。この記事では、JDK 27で導入される注目すべきランタイムの変更点をすべて解説します。
JDK 27 リリースで導入されるその他の変更点について詳しく知りたい場合は、主に開発者に影響を与えるすべての変更点を網羅したYouTube動画 Declassifying the Java 27 Release! をご覧ください。また、9月15日 15:00 UTC から Java YouTube チャンネルで配信されるJava 27 Launch Streamもぜひご覧ください。
JEP
JDK 27 リリースに含まれる9個のJEPのうち3個は、主にランタイムに影響を与えるか、あるいはシステム管理者がアプリケーションの健全性を監視するために使用されるものです。
523: Make G1 the Default Garbage Collector in All Environments
G1GCはJDK 9以降、事実上のデフォルトのガベージコレクタとなっています。しかし、利用可能なシステムリソースが限られている場合、代わりにSerial GCが使用されていました。その後のリリースでG1の改良が続けられたため、システムリソースが限られている場合でも、G1が依然として最適な選択肢となることが多くなっています。その結果、別のGCの使用を明示的に指定しない限り、すべてのケースでデフォルトのGCとしてG1GCを使用するようになりました。繰り返しになりますが、唯一の「最良のGC」というものは存在しません。各GCは、CPU使用率、メモリ使用率、ポーズ時間の間で一連のトレードオフを生じさせ、場合によってはGC内部の具体的な実装の詳細が、アプリケーションのKPIにプラスまたはマイナスの影響を与える可能性があります。したがって、最良の結果を得るためには、GCの選択と設定について常にテストと測定を行うようにしてください。
534: Compact Object Headers by Default
Compact Object Headersは、JDK 25で最終化された機能として導入され、JDK 27ではデフォルトで有効になります。つまり、これを使用するために-XX:+UseCompactObjectHeadersを指定する必要はなくなりました。Compact Object Headersはオブジェクトのメタデータのサイズを縮小し、これによりヒープ全体のサイズを約20%削減できると見込まれ、GCの負荷軽減など、下流工程にもいくつかの有益な効果をもたらします。Compact Object Headersは、-XX:-UseCompactObjectHeadersで無効にできます。
536: JFR In-Process Data Redaction
JFRは、JVM引数や環境変数として渡されたパスワードやAPIキーなどの機密情報を、デフォルトでマスキングするようになりました。また、*や?をワイルドカードオプションとして使用した、大文字小文字を区別しないglobパターンを用いて、独自のフィルタを追加することもできます。追加のフィルタは、JVM引数用にはredact-arguments、環境変数およびシステムプロパティ用にはredact-key、-XX:FlightRecorderOptionsのサブオプションとして追加できます。
例えば、環境プロパティのdburlをフィルタリングしたい場合は、次のコマンドで実現できます:
$ java -XX:FlightRecorderOptions:redact-key=dburl
フィルタが多数ある場合は、それらを別のファイルに定義し、そのファイルを参照することを検討してください:
$ java -XX:FlightRecorderOptions:redact-arguments=@args.txt
カスタムフィルタを定義する際、デフォルトのフィルタを含めるには、最初のフィルタの前に+を付けます:
$ java -XX:FlightRecorderOptions:redact-key=+dburl
noneを指定することで、デフォルトのフィルタを無効にできます:
$ java -XX:FlightRecorderOptions:redact-key=none
デフォルトのフィルタは、伏せ書きすべき機密データの最も一般的な例の多くを網羅しています:
デフォルトの redact-key フィルタ:
*api*key*
*auth*
*client*secret*
*credential*
*jaas*config*
*passphrase*
*passwd*
*password*
*private*key*
*pwd*
*secret*
*token*
デフォルトの redact-argument フィルタ:
*api*key*
*client*secret*
*credential*
*jaas*config*
*passphrase*
*passwd*
*password*
*private*key*
*pwd*
*secret*
*token*
*api*key*
*client*secret*
*credential*
*jaas*config*
*passphrase*
*passwd*
*password*
*private*key*
*pwd*
*secret*
*token*
Added Help for -XX:FlightRecorderOptions
この JEP に関連して、-XX:FlightRecorderOptionsに対するhelpコマンドが更新され、新しいredact-keyおよびredact-argumentsオプションを扱うようになりました。
jcmd Updates
jcmdコマンドライン・ツールに 3 つの新機能が追加されました。
Added Bash Autocompletion Script for jcmd Tool
$ source <JDK_HOME>/conf/bash-completion/jcmd
システム全体で利用可能にするには、スクリプトを /usr/share/bash-completion/completions/ ディレクトリに配置してください。
New jcmd Command VM.security_properties Displays Active Security Properties at Runtime
新しいコマンド VM.security_propertiesは、実行中の JVM プロセスに対する現在の Java セキュリティプロパティのセットを出力します。これは、システムプロパティ用の既存の VM.system_propertiesコマンドと同様です。この機能強化により、セキュリティ関連の設定の問題を診断およびトラブルシューティングするための、簡単でスクリプト化可能な方法が提供されます。
VM.info and hs_err_pid Logs Now Report Current Open File Descriptors
VM.infoコマンドの出力および HotSpot の致命的なエラーログ(hs_err_pid)には、実行中の Java プロセスの現在開かれているファイルディスクリプタの数が含まれるようになりました。サポートされているプラットフォームでは、新しい出力で SYSTEM セクションにアクティブなファイルディスクリプタの数が表示されます。
JVM Args Updates
このリリースでは、JVM 引数にいくつかの更新が行われました。
Removal of -noclassgc, -noverify, -verifyremote and -Xverify:none Options
いくつかの JVM 引数が削除されました。-noclassgc、-noverify、-verifyremote、および -Xverify:noneのこれらすべての引数は、以前から非推奨となっていたものです。
| 置き換え対象 | 置き換え先 |
|---|---|
-noclassgc | -Xnoclassgc |
-verifyremote | -Xverify:remote |
-noverifyおよび-Xverify:none | 置き換えなし |
Rename -XX:InitiatingHeapOccupancyPercent to -XX:G1IHOP
コマンドラインオプション-XX:InitiatingHeapOccupancyPercentは、G1GCでのみ使用されることを意図しているため、-XX:G1IHOPに名称が変更されました。旧オプションの-XX:InitiatingHeapOccupancyPercentは引き続き利用可能ですが、非推奨となっており、将来のリリースで削除される見込みですので、起動コマンドを適切に更新してください。
| 旧オプション | 新オプション | 備考 |
|---|---|---|
-XX:InitiatingHeapOccupancyPercent | -XX:G1IHOP | 引き続き旧オプションを利用できるが非推奨 |
The UseCompressedClassPointers Option Is Now Obsolete
HotSpot JVM オプション-XX:[+|-]UseCompressedClassPointersは JDK 25 で非推奨となり、JDK 27 では廃止されました。JVM は現在、常に圧縮クラスポインタを使用します。このコマンドを使用すると、警告メッセージが表示されます。
| オプション | 取り扱い |
|---|---|
| JDK 27で廃止 使用した場合警告メッセージ |
Other Updates
特定のカテゴリには明確に分類できない、注目すべき更新がいくつかあります。
JSON format thread dump now generates thread identifiers, thread counts, and the process identifier as numbers
com.sun.management.HotSpotDiagnosticMXBean.dumpThreadsおよび$ jcmd Thread.dump_to_fileによって生成される JSON 形式のスレッドダンプでは、スレッド識別子、スレッド数、およびプロセス識別子の JSON 値が、文字列(例:{ 「tid」: 3, .. })ではなく数値として生成されるようになりました。JSON 形式のスレッドダンプを解析するプログラムでは、この変更に対応するために更新が必要になる場合があります。
この変更の一環として、threadDumpオブジェクトには、スレッドダンプ形式を表す新しいメンバ formatVersionが追加されました(値は 2)。これは、スレッドダンプ形式が進化するにつれて更新されます。
JFR Event jdk.OldObjectSample Disabled for Generational ZGC
JFR イベント jdk.OldObjectSample は、許容できないほどのパフォーマンスオーバーヘッドが生じるため、世代別 ZGC を使用する際には無効化されます。
The RuntimeMXBean.getInputArguments() Method Now Adds the -XX Prefix for Arguments From a Settings File
RuntimeMXBean.getInputArguments() は、設定ファイルを介して渡された引数に -XX: プレフィックスを追加するようになりました。以前は、設定ファイルからの引数は -XX: プレフィックスなしで返されていました(例:+UseZGC)。現在では、これらの引数は -XX: プレフィックス付きで返されます(例:-XX:+UseZGC)。
Removal of the JVM Compiler Interface (JVMCI)
このリリースでは、実験的な JVM コンパイラインターフェース(JVMCI)が削除されました。これらの変更には、HotSpot JVM からの JVMCI コードの削除、モジュール jdk.internal.vm.ci、jdk.graal.compiler、および jdk.graal.compile.management、JVMCI 固有の JIT コンパイルポリシー、機能選択フラグの設定、および文字列「JVMCI」を含むすべてのフラグと -XX:+UseGraalJITの削除が含まれます。
Remove SA support for printing MethodData and the printmdo command
Serviceability Agent のprintmdoコマンドが削除されました。printmdoはclhsdbツールのサブコマンドであり、JVM 内部のコンパイラ情報であるMethodDataを表示するために使用されます。
Change the Default Values of MinHeapFreeRatio and MaxHeapFreeRatio for G1
G1 ガベージコレクタでは、オプション-XX:MinHeapFreeRatioのデフォルト値が 40 および 70 に、-XX:MaxHeapFreeRatioのデフォルト値が 0 および 100 に変更されました。その結果、G1 のヒープサイズ変更はデフォルトで事実上無効化されています。
以前のデフォルト値では、フルGCの後にヒープの拡張や縮小が引き起こされる可能性があり、特にSystem.gc()を頻繁に呼び出すアプリケーションにおいて、不要なヒープのサイズ変更が発生する恐れがありました。
-XX:MinHeapFreeRatioまたは-XX:MaxHeapFreeRatioを明示的に設定しているアプリケーションでは、指定された設定に基づいたヒープのサイズ変更動作が維持されます。
Conclusion
以上が、JDK 27における注目すべきランタイムの更新内容のすべてです。JDK 27の詳細については、開発者向けの変更点を網羅したYouTube動画 Declassifying the Java 27 Release!をご覧いただき、ぜひJava 27 Launch Streamもご覧ください。
References
- JEP 523: Make G1 the Default Garbage Collector in All Environments
- JEP 534: Compact Object Headers by Default
- JEP 536: JFR In-Process Data Redaction
- JDK-8367584 Added Help for -XX:FlightRecorderOptions
- JDK-8357439 Added Bash Autocompletion Script for jcmd Tool
- JDK-8364182 New jcmd Command VM.security_properties Displays Active Security Properties at Runtime
- JDK-8359706 VM.info and hs_err_pid Logs Now Report Current Open File Descriptors
- JDK-8373481 Removal of -noclassgc, -noverify, -verifyremote and -Xverify:none Options
- JDK-8227106 Rename -XX:InitiatingHeapOccupancyPercent to -XX:G1IHOP
- JDK-8363996 The UseCompressedClassPointers Option Is Now Obsolete
- JDK-8381002 JSON format thread dump now generates thread identifiers, thread counts, and the process identifier as numbers
- JDK-8382740 JFR Event jdk.OldObjectSample Disabled for Generational ZGC
- JDK-8378110 The RuntimeMXBean.getInputArguments()()
- JDK-838258 Removal of the JVM Compiler Interface (JVMCI)
- JDK-8377797 Remove SA support for printing MethodData and the printmdo command
- JDK-8238686 Change the Default Values of MinHeapFreeRatio and MaxHeapFreeRatio for G1