Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Catch up Java 12 and Java 13

4,097 views

Published on

Presentation for Java Japan User Group CCC 2019 Spring

Published in: Technology
  • Be the first to comment

Catch up Java 12 and Java 13

  1. 1. CatchupJava12andJava13 KUBOTAYuji(@sugarlife) LINECorporation JJUGCCC2019Spring(2019/May/18)
  2. 2. KUBOTAYuji(@sugarlife) JVM好き,IcedTeacommitter/OpenJDKAuthor WEB+DBで「DivetoJava」連載中 https://www.slideshare.net/YujiKubota/ 好きなパッケージは sun.jvm.hotspot 2
  3. 3. 本セッションで話すこと Java12から利用できる機能と変更点 Java13以降から利用できる可能性がある機能と変更点 話さないこと 非互換性 git.io/jdk12git.io/jdk11git.io/jdk10 3
  4. 4. 前置き 本資料は jdk.java.net からダウンロードできる JDK 12.0.1 およ び JDK 13 (build 20) で極力動作確認していますが、全ての確認はで きていませんのでコードを修正する前に動作確認してください 実装は hg.openjdk.java.net/jdk-updates/jdk12u および jdk/jdk で確認しています 4
  5. 5. Java12 8JavaEnhancementProposals(JEP) 101Compatibility&SpecificationReviews(CSR) 10FixedEnhancementTickets 286FixedBugTickets 5
  6. 6. JEPs 189:Shenandoah:ALow‑Pause‑TimeGarbageCollector (Experimental) 230:MicrobenchmarkSuite 325:SwitchExpressions(Preview) 334:JVMConstantsAPI 340:OneAArch64Port,NotTwo 341:DefaultCDSArchives 344:AbortableMixedCollectionsforG1 346:PromptlyReturnUnusedCommittedMemoryfromG1 6
  7. 7. 189:Shenandoah:ALow‑Pause‑TimeGarbageCollector (Experimental) 重要度:★☆☆ 乱暴に言うとConcurrentなEvacuationを持つ非世代別なG1GC G1はライブオブジェクトのCopy時(≒Evacuation)にJavaスレ ッドを止めて(≒StopTheWorld,STW)オブジェクトのアドレス 更新する必要があるが、Shenandoahは関節参照を追加するこ とで常にアドレスを最新の状態に保つようにしてこのSTWを 削減した ヒープをリージョンに区切って等しく(世代別ではなく)管理し てるので、総ヒープサイズに依存することなく一回のGC時間 は一定だと期待できる。 100GBと2GBで変わらないと良く書かれてるのはこれ とはいえゴミが多ければGC頻度が増えて総時間も増える ことは普通にある 7
  8. 8. Experimental機能。将来的に正式機能となる見込み。 RedHatが開発したのでRedHat提供のOpenJDKでは Production‑readyとして入っている 現時点で使うとしたらヒープサイズや、プロセスが良く作るオ ブジェクトの種類に応じて選択することになる 以下、個人の所感 G1は全リージョンスキャンするタイミングが少ないので クラスアンローディングなどが苦手 ZGCは基本32GB以上前提なのとほぼ全て並列処理なので 比較的CPUネックになりやすい Parallelは巨大ヒープでSTWが極悪になる ShenandoahはG1とZGCのいいとこ取りのようにも見え るがCompressedOops有無や弱参照の比較を見てみたい ServiceabilityToolの対応状況も大事 8
  9. 9. 346:PromptlyReturnUnusedCommittedMemoryfromG1 重要度:★★☆ 未使用のメモリをOSに返すようになった G1のconcurrentmarkcycle時に最大で最小ヒープサイズまで 不要なメモリを返すようになった G1の改善型とも言えるShenandoahの取り組みがG1にも反映 された -XX:G1PeriodicGCInterval でチェックする間隔をミリ秒 で設定できる HotSpotVMは基本的に一度掴んだメモリはOSに返さない振舞いを するので、短い期間しか重い処理を行わないようなプロセスは常駐 に不向きだった。このようなケースが解消される 9
  10. 10. 344:AbortableMixedCollectionsforG1 重要度:★★☆ MixedGCを中断可能にすることで、ユーザが設定した停止時間の 目標値を守りやすくした G1はヒープをリージョンと呼ばれる単位で管理し、目標値を 達成できるようにGC対象とするリージョンのリスト(コレクシ ョンセット,CSet)を決定するが、アプリ動作が変わるなどして CSetが大きくなりすぎて目標値を超過してしまうことがある 誤った量のCSetを繰り返し選択した状態を検出してMixedGC を中断可能にすることで、目標値を守れる度合を増やせるよう にした 検出したら段階的にCSetを選択して実行する 10
  11. 11. この改善の際に得られたヒントにより次の改善等がJava13で行わ れた JDK‑8218668:Cleanupevacuationofoptionalcollectionset JDK‑8219100:Improvedo_collection_pause_at_safepoint このようにGCは継続的に改善が行われていく 11
  12. 12. 325:SwitchExpressions(Preview) 重要度:★☆☆ かなり便利なのだがプレビュー版なのでJava12を導入したら 即使うものでもない --enable-preview オプションを指定する必要がある フィードバックを得て(いくつか変更を経て)正式に導入さ れる予定 Switch「文」が「式」として使用できるようになった 条件ごとに変数に代入を繰り返していたが一発で書けるように なった 副作用としてbreak抜けなどを防げるので積極的に導入したい 12
  13. 13. 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; } } 13
  14. 14. 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; } } }; 14
  15. 15. 341:DefaultCDSArchives 重要度:★★☆ 何もせずともJavaプロセスの起動時間が短縮される Class‑DataSharing,CDSとはクラスや文字列などをアーカイ ブファイルにダンプして複数プロセスで共有する機能 JDKのクラスは当然ながら最も共有可能な情報なのでこのアー カイブファイルが提供された、というのがこれ クラスローディングが一部省略される等でプロセスの起動時間 やメモリフットプリントが削減される FaaSとか短命プロセスを立ち上げまくるケースで特に有効 AppCDSも組み合わせるのが良い 15
  16. 16. 334:JVMConstantsAPI 重要度:★★☆ Java10まではprimitiveとリテラルを持つStringだけConstant‑Pool に格納できた Java11から通称 condy と呼ばれる ConstantDynamic がサポート され、その他もConstant‑Poolで扱えるようになり、かつ定数の初 期化処理が必要になるまで遅延可能になった この遅延効果によりJavaプロセス起動が早くなる 16
  17. 17. 今回のはこれのJDKAPIの追加 java.lang.constant パッケージが java.base モジュール に追加され、定数として使われるであろうクラス群( Integer や Enum 等)が拡張された Lombokなりで対応したいが自作の定数クラスについても Constable や ConstantDesc インターフェースを実装するの が望ましいかも かも=まだ(私の中で)ベストプラクティスが定まってない この取組はProjectAmberの一環なのでBrianGoetzの仕様草案(の一 部)もとても参考になる 17
  18. 18. (APIの変更差分) https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lan g/Integer.html 18
  19. 19. 230:MicrobenchmarkSuite 重要度:★☆☆ OpenJDK開発者向けであって利用者的には関係なし JavaMicrobenchmarkHarness(JMH)というマイクロベンチマーク のフレームワークがOpenJDKコミュニティで開発・提供されてい る JDKソースコードにこれを利用したベンチマークが追加された JMHはマイクロベンチマーク時の選択肢の一つとして大変便利 (IntelliJプラグインもある) 19
  20. 20. 340:OneAArch64Port,NotTwo 重要度:★☆☆ OpenJDKのARM64bitポーティングのコードが重複(arm64, aarch64)してたのでaarch64にマージされた 完全にOpenJDK開発者向けであって利用者的には全く関係なし 20
  21. 21. APIs すべてのAPI差分はJSR386(Java12のJavaSpecificationRequest)のペ ージから入手できる JSR‑000386JavaSE12FinalReleaseAnnex2forEvaluation 21
  22. 22. bitnotableAPIs CompactNumberFormat InputStream#skipNBytes String#indent Files#mismatch notableAPIs String#transform Collectors#teeing CompletableFuture#exceptionally{Compose}{Async} 22
  23. 23. java.text.CompactNumberFormat JDK‑8177552:CompactNumberFormattingsupport jshell> NumberFormat.getCompactNumberInstance() .format(10000) $2 ==> "1万" 23
  24. 24. 端数どうしてると思います? jshell> NumberFormat.getCompactNumberInstance() .format(15001) $3 ==> "2万" jshell> NumberFormat.getCompactNumberInstance() .format(14005) $4 ==> "1万" 24
  25. 25. java.io.InputStream#skipNBytes(long) 指定したバイト数データをskipする 既存の skip(long) はskipしたバイト数を返す 今回の skipNBytes(long) は指定したバイト数skipできなかった ら EOFException を返す エラー時に -1 か Exception のどちらを返すべき? String#indent(int) 指定した数分インデントを追加する。マイナスなら削除 Files#mismatch(Path,Path) 指定した二つのファイルの最初の差分の位置を返す。同じなら -1 25
  26. 26. String#transform(Function<?superString,?extendsR>f) Stringに対する関数を適用させるメソッド 考える順にlambda式で書けるので見通しが良い 例:プログラム言語からマスコットのライセンスを取得する 言語名からマスコット名を取得するメソッド Mascot::getName マスコット名からライセンスを取得するメソッド Mascot::getLicense Mascot.getLisence(Mascot.getName("Java")) "Java".transform(Mascot::getName) .transform(Mascot::getLisence) 26
  27. 27. 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なスレッドの個数を","でつなぐと言ったこと もできる 27
  28. 28. CompletableFuture#exceptionally{Compose}{Async} Exceptionhandlerである exceptionally(Function) メソッドが 元々あり、これは前段で例外がスローされたときにキャッチ(して実 行)するメソッド これを非同期に行う Async とthenComposeを行う Compose 、 Composeを非同期で行う ComposeAsync が追加された Async はForkJoinPoolの管理ワーカで実行される(通常のエラ ーハンドリング処理はメインスレッドでやる) 分かりやすいので CompletableFuture クラスで紹介しているが、 実態は CompletionStage インターフェースに追加された 28
  29. 29. CompletableFuture.runAsync(() -> { // エラーが生じうる処理 throw new RuntimeException(); }).exceptionallyAsync(e -> { // ここのパターンが増えた // エラーハンドリング処理 return null; }).get(5, TimeUnit.SECONDS); 29
  30. 30. Otherenhancements JDK‑8209923:Unicode11 JDK‑8202286:AllocationofoldgenerationofJavaheapon alternatememorydevices JDK‑8211845:Anewswitchtocontrolverbosityofhs‑errfiles -XX:+ExtensiveErrorReports JDK‑8205517:JFRtool jfr print --json --category xxx --event yyy zzz.jfr フライトレコードをElasticにjsonで流すなどが可能に 30
  31. 31. Java13+ Projects Amber Valhalla Panama Loom Metropolis Skara Portola JEP:35Draft,5Submitted,27Candidate JIRABoard 31
  32. 32. ProjectAmber Java言語仕様の大変革 動的なクラスファイル定数 SymbolicReferencesforConstants SwitchExpression RawStringLiterral Patternmatching 大きすぎてまとめて入るのではなく少しずつ入ってきてる 下2つはJava12に間に合わなかったが一部はAPI追加という形 で入ってきてる(String#indentなど) 32
  33. 33. ProjectValhalla 配列レイアウト改善 CPUキャッシュ効率改善に向けた value 型の追加 33
  34. 34. ProjectPanama JVMの外側との連携 安全かつ高性能なJNIの置き換え Javaコードとネイティブコードとの連携 ForeignFunctionInterface,FFI Javaコードからの低レベルなHW制御 Vector演算、不揮発性メモリ 34
  35. 35. ProjectLoom 軽量スレッドFiber JVMで百万規模のスレッド(Fiber)を動かす マルチスレッドプログラミングの簡易化 35
  36. 36. ProjectMetropolis Java‑on‑Java Graalcompiler AOTstaticcompilation 36
  37. 37. ProjectSkara https://github.com/openjdk/jdk 37
  38. 38. ProjectPortola PortingtoAlpine/musl 38
  39. 39. 350:DynamicCDSArchives Java13で導入予定 アプリケーション実行終了時にクラスを動的にアーカイブする仕組み Java12はJDK標準ライブラリクラスのアーカイブが同梱され、この取組 でロードされたアプリケーションクラスやライブラリクラスのを自動的 にアーカイブすることで、より楽にAppCDSを使えるようになる 元々AppCDSを使うには一度クラスをロードさせる必要があるので試運 転が必要だった。なおロードされなかったクラスは動作に不要なのでア ーカイブされない 39
  40. 40. 351:ZGC:UncommitUnusedMemory Java13で導入予定 Java12で入ったG1のと同様にZGCも使ってないメモリをOSに返すよう になる。ちなみに今のところは返さない Shenandoahは最初から返す仕組みが備わっている 40
  41. 41. 353:ReimplementtheLegacySocketAPI Java13で導入予定(提案レビュー中) SocketAPI( java.net.Socket , java.net.ServerSocket )の一新 既存実装はSocketImplのレガシーなSPI(SupportProviderInterface)機構 のJavaとCの実装で成り立っており、スレッドスタックをI/Oバッファと して利用していたり、非同期処理をnativeなデータ構造で達成していた りと信頼性や移植性が損ねる状態だった 今後ProjectLoomによりユーザモードなスレッド(Fiber)が導入されるこ ともあり、ネイティブな世界でブロックすることなく停止(park)できる ように NioSocketImpl が導入される。とはいえ昔の実装も使えるよう オプションで切り替えられる予定 41
  42. 42. 352:Non‑VolatileMappedByteBuffers NVM向けの MappedByteBuffer API追加 この流れでunmmapedするAPIも生えないかしら 42
  43. 43. 301:EnhancedEnums 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; 43
  44. 44. 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; 44
  45. 45. 305:Patternmatchingforinstanceof Before if (obj instanceof Double) { Double d = (Double) obj; // d を使った処理 } After if (obj instanceof Double d) { // d を使った処理 } switch でも同じように書ける switch (obj) { case Integer i: // intの時にやらせたい処理 case Double d: // doubleの時にやらせたい処理 } 45
  46. 46. 355:TextBlocks 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> """; 46
  47. 47. 349:JFREventStreaming これまでディスクに書き込まれたバイナリデータから解析やモニタリン グを行う必要があったが、ストリーミングで流し込むことが可能になる 今まで何故なかったのかというぐらい便利。性能次第ではJMXや一部の ロギングをこれに置き換えることも十分にあり得る 早く来て欲しい 47
  48. 48. CatchupJava12andJava13 KUBOTAYuji(@sugarlife) LINECorporation JJUGCCC2019Spring(2019/May/18)

×