JJUGナイトセミナー「JDK 11リリース記念:今知っておくべきJDK 11の重要ポイント」に行ってきた #jjug

先日、JJUGナイトセミナー「JDK 11リリース記念:今知っておくべきJDK 11の重要ポイント」に行ってきました。簡単に所感をまとめます。

jjug.doorkeeper.jp

メモから抜粋。(詳しくは資料をご参照ください)

Java Is Still Free

Java Is Still Free の翻訳がついに来た。ありがたい。

www.sakatakoichi.com

JDK 11 リリースなので改めて「新しい JDK リリースモデル解説 (サマリー&アップデート)」

www.slideshare.net

  • Oracle OpenJDK
    • GPLv2 + Classpath Exception
    • ラクルによるセキュリティアップデート提供
  • Oracle JDK
    • 今まで(v9/v10)までのライセンスと少し違う
    • 商用ライセンス or OTNLA for Oracle Java SE
    • JDK11以降は社内もしくは個人での開発/テスト/試作/デモの用途では無償で利用可能
  • OTNLAが6ヶ月で切れるかどうかは未定 (LTSと同期間になる可能性はある)
  • JMCは個別にダウンロードできるようになる
  • Subscription
    • Javaが実行される可能性のあるすべてのハードウェアが対象
    • デスクトップとサーバーが対象 (クラウド含む)
    • Named User Plus (1台から購入可能、個人でも購入できる予定)
    • Processor

Java 11 : サポートとVM機能編

www.slideshare.net

サポート

  • 開発サポート
    • OpenJDK コミュニティ
  • 配信サポート
    • OpenJDK コミュニティは配信はしていない
  • 問い合わせサポート
  • AdoptOpenJDK
    • 配信サポート期間が一番長い(4年)
  • OpenJDK の開発サポートは現時点では3年間
    • 今後より長くなる可能性もある
  • Oracle JDK から OpenJDK のマイグレーション
    • 証明書周りがネックになるかも (配信元による)
    • だいたいはライセンスの問題
  • AdoptOpenJDK のリリースが遅れているかのは大丈夫か
    • テスト期間があるので1-2週間は遅れる
    • ゼロデイ攻撃が心配なら Oracle OpenJDK の利用を検討する
  • JRE
    • コンテナなどで、バイナリサイズを削減したいなら jlink を使う
    • モジュール化が進むとより効果がありそう
  • 特に理由がなければ OpenJDK の開発サイクルが短いバージョンは無視してOK
  • 多くの場合、必要なのは配信サポート
    • AdoptOpenJDK が4年なのでマイグレーションに1年の猶予がある
    • 問い合わせサポートは予算とSLAに依存する

VM機能

  • JEP 330
    • ソースファイルを java コマンドで実行
    • Java ソースをスクリプトのように扱う (バージョン指定可能)
  • JEP 328 (Flight Recorder)
    • プロファイラ
    • Oracle JDK のものとはオプション構成が違う
  • JEP 318 (Epsilon)
    • No-Op GC
    • 主に開発や研究用途を想定
  • JEP 333 (ZGC)
    • アプリケーションスレッドとGCスレッドの並列化
    • 従来のGCとはアルゴリズムが異なる (世代別GCではない、など)
    • 64bit, Linux 限定

Java 11 : APIの変更点編

  • JEP 181 (Nest-Based Access Control)
    • Nestmates
    • 第5のアクセス制御 (インナークラス間の private メンバ参照)
    • NestHost, NestMembers
  • JEP 309 (Constant Dynamic, condy)
    • Constant Dynamic が Constant Pool に入る
    • static final フィールドではなく、class-file 上の定数
  • JEP 320
    • Java EE & CORBA 関連モジュール削除
    • Maven artifact を使う
  • JEP 321 (HTTP Client)
    • モダンな API, HTTP2, Reactive
    • 非同期呼び出しの場合は Flow が返る
  • JEP 323
    • ローカル変数の型推論が Lambda で使えるように

API

  • trim は全角空白は取れないが、strip は全角空白が取れる
  • Collection#toArrayIntFunction を取るように
    • List.of("aaa").toArray(String[]::new) (要素数を指定せずにメソッド参照で書ける)
  • Predicate.not
    • 今までメソッド参照が使えなかったところが使えるように (String::inEmpty とか)
  • 元号対応 (Japanese Era)
    • "JapaneseEra.HEISEI 31/5/1" 以降を指定するとエラーになる
  • += のバグ
  • TimSort

JDK12

  • JEP 326 (Raw String Literals)
    • バッククォートで囲む
    • 変数の埋込は今のところない
  • JEP 325: Switch Expressions

さり気なく JShell のバージョンが JDK 12 っていうのがなんとも。