Oracle Code One 2019速報レポート

第1回 新しいリリースサイクルで進化を続けるJava[c1jp]

この記事を読むのに必要な時間:およそ 3 分

Javaの進化をどのように支えていくか

キーノートの後半はJavaの話題でした。2年前のJavaOneで,OracleはJavaのライフサイクルに関する大きな方向転換を発表しました。数年に一度大型のアップデートを行うこれまでのリリースモデルを改め,6ヵ月に1度のバージョンアップを継続して行っていくスタイルに変えたのです。それから2年が経ち,すでに新しいリリースモデルでJava 10/11/12の3つのバージョンがリリースされました。そしてこのキーノートが行われた翌日の9月17日(現地時間⁠⁠,最新版となるJava 13がリリースされましたstrong>※。

The arrival of Java 13!

キーノートの進行役を務めたOracleのGeorge Saab氏は,Javaは依然としてさまざまな分野で重要な位置にあることを強調した上で,このような素早い変化にどのように対応していくのかを,各分野の専門家とともに語りました。

Javaは依然として重要

Javaは依然として重要

たとえば,Javaには従来より「JCP(Java Community Process⁠⁠」という標準化プロセスがあります。Javaの標準仕様は,Oracleなどの特定の企業ではなく,このJCPによって策定されています。現在,Javaの開発自体はOpenJDKプロジェクトに完全に移管されましたが,これによってJCPの役割はどう変わったのでしょうか。

これについては,JCPのExecutive CommitteeであるGil Tene氏とBruno Souza氏が登壇して,今後の方針について紹介しました。両氏によると,JSPによる仕様の標準化プロセスは従来通りに機能しており,新しいJavaのリリースサイクルに対応できるようプロセス自体も調整されているとのことです。そのほかにも参照実装の決定などさまざまな役割がありますが,中でも重要なのはJavaが分裂してしまうリスクを最小限に抑えることだと言います。これまで通り標準化を適切にハンドリングすることで,Javaが細分化して互換性が失われるようなことにならないよう務めていくとのことです。

Bruno Souza氏(中央)とGil Tene氏(左)

Bruno Souza氏(中央)とGil Tene氏(左)

新しいリリースサイクルで進化を続けるJava

さて,前述のように間も無くJava 13がリリースされます。Java 10から12までの3つのバージョンで,すでに多くの新機能が追加されました(詳細はOpenJDKのプロジェクトサイトを参照してください⁠⁠。

Java 13には以下の5つのJEP(JDK Enhancement Proposals)が含まれます。JEPはOpenJDKに対する機能の追加や変更の提案で,OpenJDKの開発はこのJEPをもとにして実装が行われ,有効なものが将来のJDKに取り込まれていくという手続きになっています。

とくに多くの開発者に関係するのがJEP 354とJEP 355でしょう。JEP 354はswitchを式として記述できるようにするという提案です。すでにJEP 325としてJava 12にプレビュー版が導入されていましたが,そのフィードバックを受けていくつかの修正を加えられたものがJEP 354となります。

Switch式の記述例

class Switch {
    static int numLetters(Day day) {
        return switch (day) {
            case MONDAY, FRIDAY, SUNDAY -> 6;
            case TUESDAY -> 7;
            case THURSDAY -> 8;
            case WEDNESDAY -> 9;
        }
    }
}

JEP 355は,複数行のテキストブロックをシンプルに記述できるようにするという提案です。次の例のように,改行を含む文字列を,改行のエスケープ文字などを使うことなく記述することが可能になります。ブロックの開始と終了は,3つ連続したダブルクォーテーションで表します。

テキストブロックの記述例

String html = """
            <html>
                <body>
                    <p>Hello World.</p>
                </body>
            </html>
            """;

仕様の変更とは別に,JVM自体の性能についても,地道なチューニングによって大幅に向上しているそうです。OracleでJVMの開発を担当するMikael Vidstedt氏は,JDK 8からJDK 13にかけてのJVMの性能の変化について説明しました。まず起動時間については,JDK 9でモジュールが導入されたことによって大幅に悪化したものの,現在は最適化が進んでJDK 8の頃よりも高速になっているとのことです。

起動時間の向上

起動時間の向上

JDK 10で導入されたApplication CDS(AppCDS)を活用すれば,さらなる起動時間の高速化が可能です。

Micronautによる起動時間の向上

Micronautによる起動時間の向上

G1を使ったJVMについては,スループットはJDK 11以降ほぼ横ばいですが,応答性能については徐々に向上しています。

G1のパフォーマンスの向上

G1のパフォーマンスの向上

GCの停止時間はZGCが圧倒的です。ただし,ZGCはヒープサイズが巨大な環境を想定したGCであり,おもにエンタープラズ用途の大規模アプケーションでなければ十分な効果は得られないという特徴があります。

GCの停止時間の比較

GCの停止時間の比較

昨今では,GraalVMなどを利用したネイティブバイナリ化も大きな話題となっており,Javaアプリケーションの起動・実行性能についてはまだまだ向上の余地がありそうです。

キーノートの最後には,現在OpenJDKで進められている4つのサブプロジェクトについても紹介がありました。

  • Project Amber ― さまざまなJava言語の拡張
  • Project Loom ― 継続(Continuation)や軽量スレッド(Fiber)の導入
  • Project Panama ― JVMとネイティブコードとのインターフェースを最適化する
  • Project Valhalla ― Value Typeやジェネリクスの特殊化の導入

このうち,Amberについてはすでにいくつかの機能が実際に導入されています。たとえばJava 13のSwitch式やテキストブロックはAmberの一部です。残りの3つのプロジェクトは極めて大きな機能追加となるため,まだ具体的にどのバージョンのJavaに入るのかは決まっていません。しかし実現した際には大きなイノベーションとなる可能性を秘めているので,今のうちからチェックしておくことをおすすめします。

昨年のCode Oneに引き続いて,今回のキーノートでもこれといって新しい大きな発表はありませんでした。しかし実際には個々のアップデートで着実に進化を続けており,気を抜いたらあっという間に置いていかれてしまいます。まさに,リリースモデルを変えた当初の目論み通りになっているという印象を受けました。

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書

バックナンバー

Oracle Code One 2019速報レポート