Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Catch up Java 12 and Java 13

Catch up Java 12 and Java 13

2019/5/28に開催されたLINE Developer Meetup #54 in Fukuokaでの登壇資料です

LINE Developers
PRO

May 28, 2019
Tweet

More Decks by LINE Developers

Other Decks in Technology

Transcript

  1. Catch up Java 12 and Java 13 #LINE_DM version KUBOTA

    Yuji (@sugarlife) LINE Corporation LINE Developer Meetup #54 in Fukuoka(2019/May/28)
  2. KUBOTA Yuji (@sugarlife) JVM好き, IcedTea committer / OpenJDK Author WEB+DBで「Dive

    to Java」連載中 https://www.slideshare.net/YujiKubota/ 好きなパッケージは sun.jvm.hotspot 2
  3. 本セッションで話すこと 以下の重要な部分のみ Java 12から利用できる機能と変更点 Java 13やそれ以降から利用できる可能性がある機能と変更点 話さないこと 非互換性 git.io/jdk12 git.io/jdk11

    git.io/jdk10 3
  4. 前置き 本資料は jdk.java.net からダウンロードできる JDK 12.0.1 および JDK 13 (build

    20) で極 力動作確認していますが、全ての確認はできていませんのでコードを修正する前に動作確認してくだ さい 実装は hg.openjdk.java.net/jdk-updates/jdk12u および jdk/jdk で確認しています 4
  5. Java 12 8 Java Enhancement Proposals (JEP) 101 Compatibility &

    Specification Reviews (CSR) 10 Fixed Enhancement Tickets 286 Fixed Bug Tickets 5
  6. JEPs 189: Shenandoah: A Low‑Pause‑Time Garbage Collector (Experimental) 230: Microbenchmark

    Suite 325: Switch Expressions (Preview) 334: JVM Constants API 340: One AArch64 Port, Not Two 341: Default CDS Archives 344: Abortable Mixed Collections for G1 346: Promptly Return Unused Committed Memory from G1 6
  7. 189: Shenandoah: A Low‑Pause‑Time Garbage Collector (Experimental) 重要度:★☆☆ 乱暴に言うとConcurrentなEvacuationを持つ非世代別なG1 GC

    G1はライブオブジェクトのCopy時(≒ Evacuation)にJavaスレッドを止めて(≒ Stop The World,STW)オブジェクトのアドレス更新する必要があるが、Shenandoahは間接参照を追 加することで常にアドレスを最新の状態に保つようにしてこのSTWを削減した ヒープをリージョンに区切って等しく(世代別ではなく)管理してるので、総ヒープサイズに 依存することなく一回のGC時間は一定だと期待できる。 100GBと2GBで変わらないと良く書かれてるのはこれ とはいえゴミが多ければGC頻度が増えて総時間も増えることは普通にある 7
  8. Experimental機能。将来的に正式機能となる見込み。 Red Hatが開発したのでRed Hat提供のOpenJDKではProduction‑readyとして入っている 現時点で使うとしたらヒープサイズや、プロセスが良く作るオブジェクトの種類に応じて選 択することになる 以下、個人の所感 G1は全リージョンスキャンするタイミングが少ないのでクラスアンローディングなど が苦手 ZGCは基本32GB以上前提なのとほぼ全て並列処理なので比較的CPUネックになりや

    すい Parallelは巨大ヒープでSTWが極悪になる ShenandoahはG1とZGCのいいとこ取りのようにも見えるがCompressedOops有無 や弱参照の比較を見てみたい Serviceability Toolの対応状況も大事 8
  9. 346: Promptly Return Unused Committed Memory from G1 重要度:★★☆ 未使用のメモリをOSに返すようになった

    G1のconcurrent mark cycle時に最大で最小ヒープサイズまで不要なメモリを返すようにな った G1の改善型とも言えるShenandoahの取り組みがG1にも反映された -XX:G1PeriodicGCInterval でチェックする間隔をミリ秒で設定できる HotSpot VMは基本的に一度掴んだメモリはOSに返さない振舞いをするので、短い期間しか重 い処理を行わないようなプロセスは常駐に不向きだった。このようなケースが解消される 9
  10. 344: Abortable Mixed Collections for G1 重要度:★★☆ Mixed GCを中断可能にすることで、ユーザが設定した停止時間の目標値を守りやすくした G1はヒープをリージョンと呼ばれる単位で管理し、目標値を達成できるようにGC対象とす

    るリージョンのリスト(コレクションセット,CSet)を決定するが、アプリ動作が変わるなど してCSetが大きくなりすぎて目標値を超過してしまうことがある 誤った量のCSetを繰り返し選択した状態を検出してMixed GCを中断可能にすることで、目 標値を守れる度合を増やせるようにした 検出したら段階的にCSetを選択して実行する 10
  11. 325: Switch Expressions (Preview) 重要度:★☆☆ かなり便利なのだがプレビュー版なのでJava 12を導入したら即使うものでもない --enable-preview オプションを指定する必要がある フィードバックを得て(いくつか変更を経て)正式に導入される予定

    Switch「文」が「式」として使用できるようになった 条件ごとに変数に代入を繰り返していたが一発で書けるようになった 副作用としてbreak抜けなどを防げるので積極的に導入したい 11
  12. Before boolean isLTS; switch (javaVersion) { case 8: case 11:

    isLTS = true; break; case 9: case 10: case 12: isLTS = false; break; default: if (javaVersion > 11 && (javaVersion-11)%6==0) { isLTS = true; } else { isLTS = false; } } 12
  13. After // 式なので代入可能 boolean isLTS = switch (javaVersion) { case

    8, 11 -> true; // 複数case, -> で戻り値 case 9, 10, 12 -> false; default -> { // 囲めば処理も書ける if (javaVersion > 11 && (javaVersion-11)%6==0) { break true; // break で戻り値指定 } else { break false; // break はyield などに変わる可能性あり } } }; 13
  14. 341: Default CDS Archives 重要度:★★☆ 何もせずともJavaプロセスの起動時間が短縮される Class‑Data Sharing, CDSとはクラスや文字列などをアーカイブファイルにダンプして複数 プロセスで共有する機能

    JDKのクラスは当然ながら最も共有可能な情報なのでこのアーカイブファイルが提供され た、というのがこれ クラスローディングが一部省略される等でプロセスの起動時間やメモリフットプリントが削 減される FaaSとか短命プロセスを立ち上げまくるケースで特に有効 AppCDSも組み合わせるのが良い 14
  15. APIs すべてのAPI差分はJSR 386(Java 12のJava Specification Request)のページから入手できる JSR‑000386 Java SE 12

    Final Release Annex 2 for Evaluation 15
  16. bit notable APIs CompactNumberFormat InputStream#skipNBytes String#indent Files#mismatch notable APIs String#transform

    Collectors#teeing CompletableFuture#exceptionally{Compose}{Async} 16
  17. java.text.CompactNumberFormat JDK‑8177552: Compact Number Formatting support jshell> NumberFormat.getCompactNumberInstance() .format(10_000) $2

    ==> "1 万" 17
  18. 端数どうしてると思います? jshell> NumberFormat.getCompactNumberInstance() .format(15_001) $3 ==> "2 万" jshell> NumberFormat.getCompactNumberInstance()

    .format(14_005) $4 ==> "1 万" 18
  19. String#transform(Function<? super String, ? extends R> f) Stringに対する関数を適用させるメソッド 考える順にlambda式で書けるので見通しが良い 例:プログラム言語からマスコットのライセンスを取得する

    言語名からマスコット名を取得するメソッド Mascot::getName マスコット名からライセンスを取得するメソッド Mascot::getLicense Mascot.getLisence(Mascot.getName("Java")) "Java".transform(Mascot::getName) .transform(Mascot::getLisence) 19
  20. Collectors#teeing(Collector, Collector, BiFunction) 渡した二つのCollectorの結果をBiFunctionに流す(結合する) 一つのデータに複数の処理を同時に加工できる jshell> Stream.of("J","a","v","a"," ","1","2") .collect(Collectors.teeing( Collectors.joining(),

    Collectors.counting(), (x,y)->(x+" の文字数は"+y))) $5 ==> "Java 12 の文字数は7" 例えばスレッドのリスト対してRUNNABLEなスレッドの名前を列挙しつつ、BLOCKEDなスレ ッドの個数を","でつなぐと言ったこともできる 20
  21. Other enhancements JDK‑8209923: Unicode 11 JDK‑8205517: JFR tool jfr print

    --json --category xxx --event yyy zzz.jfr フライトレコードをElasticにjsonで流すなどが可能に 21
  22. Java 13+ Projects Amber: Java言語仕様の大変革。少しずつ入ってる Valhalla: CPUキャッシュ効率改善に向けたValue Typeの追加 Panama: JNIの置き換え、Javaからの低レベルなHW制御、等

    Loom: 軽量なスレッド(Fiber)の導入 Metropolis: Java‑on‑Java, Graal Skara: GitHub へポート (github.com/openjdk/jdk) Portola: Alpine/musl 22
  23. 350: Dynamic CDS Archives Java 13で導入予定 アプリケーション実行終了時にクラスを動的にアーカイブする仕組み Java 12はJDK標準ライブラリクラスのアーカイブが同梱され、この取組でロードされたアプリケー ションクラスやライブラリクラスを自動的にアーカイブすることで、より楽にAppCDSを使えるよう

    になる 元々AppCDSを使うには一度クラスをロードさせる必要があるので試運転が必要だった。なおロード されなかったクラスは動作に不要なのでアーカイブされない 23
  24. 351: ZGC: Uncommit Unused Memory Java 13で導入予定 Java 12で入ったG1の変更と同様にZGCも使ってないメモリをOSに返すようになる。ちなみに今の ところは返さない

    Shenandoahは最初から返す仕組みが備わっている 24
  25. 353: Reimplement the Legacy Socket API Java 13で導入予定 SocketAPI( java.net.Socket

    , java.net.ServerSocket )の一新 既存実装はSocketImplのレガシーなSPI(Support Provider Interface)機構のJavaとCの実装で成り立 っており、スレッドスタックをI/Oバッファとして利用していたり、非同期処理をnativeなデータ構造 で達成していたりと信頼性や移植性が損ねる状態だった 今後Project Loomによりユーザモードなスレッド(Fiber)が導入されることもあり、ネイティブな世界 でブロックすることなく停止(park)できるように NioSocketImpl が導入される。とはいえ昔の実装 も使えるようオプションで切り替えられる予定 25
  26. 301: Enhanced Enums Enumの拡張。二年前から取組中。 Before public enum JDKNumber { YEAR(18),

    FULL(18.3); public final Number version; JDKNumber(Number version) { this.version = version; } } float jdkVersion = (float)JDKNumber.Full.version; 26
  27. After public enum JDKNumber<T extends Number> { YEAR<Integer>(18), Full<Float>(18.3); public

    final T version; JDKNumber(T version) { this.version = version; } } float jdkVersion = JDKNumber.Full.version; 27
  28. 305: Pattern matching for instanceof Before if (obj instanceof Double)

    { Double d = (Double) obj; // d を使った処理 } After if (obj instanceof Double d) { // d を使った処理 } 28
  29. JEP draft: Pattern matching for switch (Preview) 今後 switch でも同じように書ける予定(別JEPで進行中)

    switch (obj) { case Integer i: // int の時にやらせたい処理 case Double d: // double の時にやらせたい処理 } 29
  30. 355: Text Blocks Before String html = "<html>\n" + "

    <body>\n" + " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n"; After String html = """ <html> <body> <p>Hello, world</p> </body> </html> """; 30
  31. 349: JFR Event Streaming これまでディスクに書き込まれたバイナリデータから解析やモニタリングを行う必要があったが、ス トリーミングで流し込むことが可能になる 今まで何故なかったのかというぐらい便利。性能次第ではJMXや一部のロギングをこれに置き換える ことも十分にあり得る 早く来て欲しい 31

  32. We are hiring (新宿オフィス) サーバサイドエンジニア【LINEプラットフォーム】 https://linecorp.com/ja/career/position/458 32

  33. Catch up Java 12 and Java 13 #LINE_DM version KUBOTA

    Yuji (@sugarlife) LINE Corporation LINE Developer Meetup #54 in Fukuoka(2019/May/28)