Red Hat で Solution Architect として OpenJDK を担当している伊藤ちひろ(@chiroito)です。
この記事は、Red Hat Developerのブログ記事、Not all OpenJDK 12 builds include Shenandoah: Here's why | Red Hat Developer の翻訳記事です。
OpenJDK 12がリリースされました。それには新しい機能が追加されています。これらは以下を含みます。
- 189: Shenandoah: 低休止時間のガーベジコレクタ (実験)
- 230: マイクロベンチマークスイート
- 325: Switch式(プレビュー)
- 334: JVM Constants API
- 340: 2つではなく1つのAAR64移植
- 341: デフォルトCDSアーカイブ
- 344: G1の中止可能な混合コレクション
- 346: 未使用のコミットされたメモリーをG1から速やかに返還
OpenJDK 12プロジェクトページからオープンソースビルドページへのリンクをたどると、ダウンロード可能なバイナリが表示されます。Linuxバイナリをダウンロードしてインストールし、機能リストの最初の項目である「Shenandoah」が動作するかどうかを確認します。
$ ./jdk-12/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -cp ~ Hello Error occurred during initialization of VM Option -XX:+UseShenandoahGC not supported
おや、どうしたのでしょう?
ちょっとした歴史です。高性能で低休止時間のガベージコレクタであるShenandoahは、Red Hatが主導するプロジェクトです。我々が最初にShenandoahをOpenJDKに貢献することを提案したとき、Oracle社はサポートしたくないと明言しました。それは妥当なことです。OpenJDKはフリーソフトウェアですから、不要なものをサポートする必要はありません。私たちはOracle社に、誰もが簡単にガベージコレクタを選択してビルドに含めることができる、非常にクリーンでプラグイン可能なガベージコレクタのインターフェースを設計するために協力することを伝えました。私たちはそれを一緒に行い、ShenandoahはJDK 12に入りました。
明らかにOracleはShenandoahをビルドしないことにしたようです。除外することで厳密に間違ったことをしているわけではありませんが、私には何かしっくりこないのです。これらのビルドはOracleによってサポートされていません。サポートを受けるにはOracleの商用バイナリが必要ですが、なぜShenandoahを除外するのでしょうか?単に、オープンソースのバイナリをビルドするために標準のビルドスクリプトを使用していただけかもしれません。しかし、かなり機能の少ないOpenJDKのリリースにおいて、オープンソースのビルドが最も重要な貢献の1つを除外するのは奇妙なことだと思います。Oracle社がGPLライセンスのOpenJDKビルドを提供してくれたことには本当に感謝していますが、そのすべてをビルドしてくれることを望みます。
しかし、すべてが失われたわけではありません。Red Hat Enterprise LinuxやFedoraでShenandoahを試したい場合は、JDK 8以降のすべてのビルドでサポートされていますので、ソフトウェアインストールツールを使用するか、例えば以下のように実行します。
$ yum install java-11-openjdk-devel
JDK 12を試してみたい方は、FedoraとRed Hat Enterprise Linux用のパッケージ(EPEL経由)がまもなく利用可能になります。その他のシステムでは、AdoptOpenJDKがJDK 12バイナリを提供し、そのすべてがShenandoahをサポートしています。