Shenandoah GCのサポート概要とバグ報告について

Red Hat で Java Platform Advocate として OpenJDK を担当している伊藤ちひろ(@chiroito)です。

この記事は、OpenJDK のWikiページ、https://wiki.openjdk.java.net/display/shenandoah/Main の一部を翻訳した記事です。何回かに分けて翻訳していきますので、ぜひ最後までごらん下さい。

翻訳の各リンクはこちらです。

Shenandoahは低い停止時間のガベージコレクタです。これは、実行中のJavaプログラムと同時に、より多くのガベージコレクション作業を行うことで、GCの停止時間を短縮します。Shenandoahは、同時コンパクションを含め、GC作業の大部分を同時進行で行います。つまり、停止時間はヒープサイズに正比例しなくなりました。200GBのヒープをガベージコレクションしても、2GBのヒープをガベージコレクションしても、同様の低い停止時間の動作になるべきです。

サポート概要

OS サポート

ShenandoahはOSから特別な要求があるわけではありません。しかし、ビルドにはコードをいじる必要があるかもしれません。

サポート コメント
Linux f:id:chiroito:20220401145828p:plain 主要ターゲット、継続的にテスト
Windows f:id:chiroito:20220401145828p:plain 次点のターゲット、継続的にテスト
macOS f:id:chiroito:20220401145828p:plain 追加ターゲット、コミュニティでテスト
Solaris f:id:chiroito:20220401145828p:plain 追加ターゲット、コミュニティでテスト.
その他 f:id:chiroito:20220401145930p:plain 移植は些細なことであるはずです。成功・失敗の報告をShenandoahの開発者に連絡してみてください

ハードウェアサポート

Shenandoahは、いくつかのハードウェア固有のビットを実装する必要があります。移植には、いくつかのアセンブリレベルのコーディングが必要です。

サポート コメント
x86_64 f:id:chiroito:20220401145828p:plain 主要ターゲット、継続的にテスト
x86_32 f:id:chiroito:20220401145828p:plain 次点ターゲット、継続的にテスト
AArch64 f:id:chiroito:20220401145828p:plain 主要ターゲット、継続的にテスト
PPC64 f:id:chiroito:20220401145828p:plain 次点ターゲット、コミュニティによるテスト
RISCV64 f:id:chiroito:20220401150034p:plain 次点ターゲット、コミュニティによるテスト。riscv-portの一部
ARM32 f:id:chiroito:20220401150034p:plain ゆっくり開発中、ヘルプ歓迎
S390X f:id:chiroito:20220401150051p:plain サポートしてません。貢献歓迎
SPARC f:id:chiroito:20220401150051p:plain サポートしてません。試験をするハードウェアがない
Others f:id:chiroito:20220401150051p:plain 他のプラットフォームにShenandoahを移植する意思がある場合は、Shenandoah開発者に連絡して指導を受けてください。

JDK サポート

Shenandoahは、アップストリームのOpenJDK 12+ ( JEP 189 )に含まれています。その後、OpenJDK 11u にコントリビュートされました。 OpenJDK 8uへのダウンストリームバックポートも利用可能です。Shenandoahは、"express "開発モデルに従っています。機能およびバグフィックスは、サポートされる以前のJDKリリースに継続的にバックポートされます。重要なバグフィックスは、最初にバックポートされます。そして、できるだけ早くリリースされます。クリティカルでないバグフィックスや機能は、少し遅れてバックポートされるかもしれません。共有GCやランタイムコードの改良は、簡単にバックポートできないかもしれません。OpenJDK Updatesプロジェクトの一部として、それらのいくつかはバックポートされています。主要なGCの改良は、さらに後に出荷されるかもしれません。

Supported Ready for Production Role Comment
JDK 8 f:id:chiroito:20220401150209p:plain f:id:chiroito:20220401145828p:plain 安定版LTS 8uの主流ではないバックポートとして利用可能です。利用可能かどうかはベンダに確認してください。以下の既知のベンダーのリストを参照してください。
JDK 9 f:id:chiroito:20220401150416p:plain f:id:chiroito:20220401150051p:plain 終了、早急に11/17に移行してください。
JDK 10 f:id:chiroito:20220401150416p:plain f:id:chiroito:20220401150051p:plain 終了、早急に11/17に移行してください。
JDK 11 f:id:chiroito:20220401145828p:plain f:id:chiroito:20220401145828p:plain 安定版LTS 11.0.9以降OpenJDK 11uに搭載されています。ビルド時に事前の許可が必要です。利用可能かどうかはベンダに確認してください。以下の既知のベンダーのリストを参照してください。
JDK 12 f:id:chiroito:20220401150416p:plain f:id:chiroito:20220401150051p:plain 終了、早急に17に移行してください。
JDK 13 f:id:chiroito:20220401150416p:plain f:id:chiroito:20220401150416p:plain 終了、17に移行してください。
JDK 14 f:id:chiroito:20220401150416p:plain f:id:chiroito:20220401150416p:plain 終了、17に移行してください。
JDK 15 f:id:chiroito:20220401150416p:plain f:id:chiroito:20220401150416p:plain 終了、17に移行してください。
JDK 16 f:id:chiroito:20220401150416p:plain f:id:chiroito:20220401150416p:plain 終了、17に移行してください。
JDK 17 f:id:chiroito:20220401145828p:plain f:id:chiroito:20220401145828p:plain 安定版LTS 主流のOpenJDKビルドです
JDK 18 f:id:chiroito:20220401150621p:plain f:id:chiroito:20220401150621p:plain Dev/Test 主流のOpenJDKビルドです

最新のJDKリリースを選択しなくても、ほとんどの修正と便利な機能を利用することができます。しかし、後の方のリリースの方がより最新である可能性があります。 開発リポジトリとビルドの間でどのように変更が行われるのか、その詳細を理解したい場合は、こちらをご覧ください。

リリース

Shenandoahの利用可能性は、ベンダーやJDKのリリースによって異なります。OpenJDK 12以降のビルドは、通常、デフォルトでShenandoahを含んでいます。OpenJDK 11では、ビルド時に事前の許可が必要です。 既知のベンダーのステータスは

  • Red Hat
  • Amazon
    • Amazon Correttoは, OpenJDK 11.0.9からShenandoahを含む
  • Oracle
    • OpenJDKビルドと独自ビルドの両方において如何なるリリースでShenandoahを含めない
  • Azul
    • Azul Zuluは, OpenJDK 11.0.9からShenandoahを含む
  • SAP
    • (ステータス不明)
  • AdoptOpenJDK
    • デフォルトバイナリで, OpenJDK 11.0.9からShenandoahを含む
  • Linux distributions
    • Debian は, OpenJDK 11.0.9からShenandoahを含む
    • Gentoo ebuilds for IcedTea はShenandoah を使うフラグを持つ
    • RHEL/Fedoraをベースとするディストリビューションやそれらのパッケージを使う他のディストリビューションもまたShenandoahが有効化されている。注目すべきは, CentOS, Oracle Linux, とAmazon Linux には含まれていると知られています。

ナイトリービルド

これらの場所では、(毎晩/毎週)開発ビルドが公開されています:

# イメージを最新のものに更新:
$ docker pull shipilev/openjdk
$ docker pull shipilev/openjdk:11
$ docker pull shipilev/openjdk-shenandoah:8
 
# 最新版の実行:
$ docker run --rm -it shipilev/openjdk java -XX:+UseShenandoahGC -Xlog:gc -version
[0.007s][info][gc] Using Shenandoah
...
# JDK 11 バージョンを実行:
$ docker run --rm -it shipilev/openjdk:11 java -XX:+UseShenandoahGC -Xlog:gc -version
[0.008s][info][gc] Using Shenandoah
...

# JDK 8 バックポート:
$ docker run --rm -it shipilev/openjdk-shenandoah:8 java -XX:+UseShenandoahGC -verbose:gc -version
...

バグを報告 バグを報告するには、いくつかの方法があります。以下はそのチェックリストです:

  1. 最新のナイトリービルドを試す。上のセクションを参照。
  2. 以下の「機能診断」と「パフォーマンス診断」のセクションのテクニックを使って、バグを絞り込んでみてください。
  3. その問題に対する最小限のテストケースを考えてみてください。開発者が自分でビルドして実行できるのであれば、大規模なプロジェクトも問題ありません。
  4. 以下の3つの選択肢で、バグレポートを提出してください:
    1. すべてのJDKのバージョン:shenandoah-dev メーリングリストにメッセージを送る。このメーリングリストは管理されているので、最初に購読するか、進行役があなたのメッセージを受け入れるのを待ちます。
    2. JDK 8, JDK 11:Red Hatのサブスクリプションに加入しており、FedoraまたはRHELからバイナリを実行している場合、Red Hatのサポートを通じてバグを報告してください。
    3. JDK 12 以降:OpenJDKのバグレポートに、どのビルドで動作しているのかを明記して提出してください。これは、Shenandoahの開発者に渡す前に、Oracleの人々が最初にバグを受け入れることを必要とします。
  5. いくつかの追加の質問に答えられるように準備しておきましょう。
  6. 時間があれば、パッチやナイトリーバイナリーをテストする準備をしておいてください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。