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.

JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]

JDK 13 の新機能について話します。以下、5つのテーマをカバーします。
350: Dynamic CDS Archives
351: ZGC: Uncommit Unused Memory
353: Reimplement the Legacy Socket API
354: Switch Expressions (Preview)
355: Text Blocks (Preview)
Previewの意味についても解説します。

  • Login to see the comments

JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]

  1. 1. JDK 13 へようこそ
  2. 2. • JVM Sustaining Engineer • OpenJDK Update Project Maintainer • JavaOne Rock Star • Co-author of Oracle WebLogic Server 11g 構築・運用ガイド • @DavidBuckJP • https://blogs.oracle.com/buc k/ Who am I? バック デイビッド(左)
  3. 3. Agenda • 350: Dynamic CDS Archives • 351: ZGC: Uncommit Unused Memory • 353: Reimplement the Legacy Socket API • 354: Switch Expressions (Preview) • 355: Text Blocks (Preview)
  4. 4. Agenda • 350: Dynamic CDS Archives • 351: ZGC: Uncommit Unused Memory • 353: Reimplement the Legacy Socket API • 354: Switch Expressions (Preview) • 355: Text Blocks (Preview)
  5. 5. Agenda • 350: Dynamic CDS Archives • 351: ZGC: Uncommit Unused Memory • 353: Reimplement the Legacy Socket API • 12: Preview Language and VM Features • 354: Switch Expressions (Preview) • 355: Text Blocks (Preview)
  6. 6. JEP 350 Dynamic CDS Archives
  7. 7. Class Data Sharing java (JVM) クラスデータ (メモリ上) java (JVM) クラスデータ (メモリ上) java (JVM) クラスデータ (メモリ上) java (JVM) クラスデータ (メモリ上)
  8. 8. Class Data Sharing java (JVM) java (JVM) java (JVM) java (JVM) クラスデータ classes.jsa
  9. 9. Class Data Sharing の歴史 • 2004 Class Data Sharing - JDK 5 • 2015 Application Class Data Sharing - JDK 8u40 and JDK 9 (Closed Source) • 2018 JEP 310: Application Class Data Sharing - JDK 10 (Open Source)
  10. 10. Class Data Sharing の魅力 • 起動時間を早くする • 複数の JVM のメモリ使用量を減らす
  11. 11. Class Data Sharing の歴史 • 2004 Class Data Sharing - JDK 5 • 2015 Application Class-Data Sharing - JDK 8u40 and JDK 9 (Closed Source) • 2018 JEP 310: Application Class-Data Sharing - JDK 10 (Open Source)
  12. 12. Class Data Sharing の歴史 • 2004 Class Data Sharing - JDK 5 • 2015 Application Class-Data Sharing - JDK 8u40 and JDK 9 (Closed Source) • 2018 JEP 310: Application Class-Data Sharing - JDK 10 (Open Source)
  13. 13. Class Data Sharing (JDK 5 以来) • Java SE のクラスライブラリ(rt.jar) のみ • jre/lib/[arch]/client/classes.jsa
  14. 14. Class Data Sharing (JDK 5 以来) • Xdump • -Xshare:dump • -Xshare:off • -Xshare:on • -Xshare:auto (デフォルト)
  15. 15. Application Class Data Sharing(JDK 8u40) • アプリケーションのクラスもアーカイブ出来る • -XX:SharedClassListFile でアーカイブを指定する
  16. 16. Application Class Data Sharing(JDK 8u40) 1. ロードされるクラスを確認する 2. 1で確認したクラスを指定して、アーカイブを作成する 3. 実行時にアーカイブを指定する
  17. 17. ロードされるクラスを確認する $ java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld
  18. 18. 確認したクラスを指定して、 アーカイブを作成する $ java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar
  19. 19. 実行時にアーカイブを指定する $ java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld
  20. 20. Application Class Data Sharing(JDK 8u40) 1. ロードされるクラスを確認する 2. 1で確認したクラスを指定して、アーカイブを作成する 3. 実行時にアーカイブを指定する
  21. 21. Application Class Data Sharing(JDK 8u40) 1. ロードされるクラスを確認する 2. 1で確認したクラスを指定して、アーカイブを作成する 3. 実行時にアーカイブを指定する
  22. 22. Dynamic CDS Archives(JDK 13) 1. アーカイブを作成する 2. 実行時にアーカイブを指定する
  23. 23. アーカイブを作成する $ java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
  24. 24. アーカイブを作成する $ java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
  25. 25. 実行時にアーカイブを指定する $ java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello
  26. 26. 2重の構成 Static Dynamic
  27. 27. 2アプリ物語 $ java -cp:lib.jar:foo.jar FooApp $ java -cp:lib.jar:bar.jar BarApp"
  28. 28. 2アプリ物語 $ java -cp:lib.jar:foo.jar FooApp $ java -cp:lib.jar:bar.jar BarApp"
  29. 29. 2アプリ物語 $ java -cp:lib.jar:foo.jar FooApp $ java -cp:lib.jar:bar.jar BarApp"
  30. 30. Class Data Sharing java (JVM) java (JVM) java (JVM) java (JVM) static rt.jar lib.jar foo.jar bar.jar
  31. 31. JEP 351 ZGC: Uncommit Unused Memory
  32. 32. ZGC: Uncommit Unused Memory 利用されていない Java ヒープ領域を OS に戻す(解放する)
  33. 33. ZGC: Uncommit Unused Memory 利用されていない Java ヒープ領域を OS に戻す(解放する) G1GC と Shenandoah はもう実装済み
  34. 34. メモリ解放する魅力 • メモリ使用量によってコストが変わる (例:container / cloud) • 長期間のアイドル (例:Serverless) • 起動処理(Startup) vs. 運用中(Steady State)
  35. 35. ZPages
  36. 36. ZPageCache ZPage を Least Recently Used (LRU)の順番で管理する
  37. 37. ZUncommitDelay -XX:ZUncommitDelay=<秒> (デフォルト5分)
  38. 38. ZUncommitDelay -XX:ZUncommitDelay=<秒> (デフォルト5分) -XX:ShenandoahUncommitDelay=<ミリ秒>
  39. 39. Linux の動作環境 • ZGC は tmpfs か hugetlbfs が利用される • fallocate() の FALLOC_FL_PUNCH_HOLE サポートが必要 • Tmpfs - Linux 3.5 以降 • Hugetlbfs – Linuc 4.3 以降
  40. 40. Xms != Xmx ?? • Xms と Xmx が異ならないかぎり、この機能は動作しない • クラウド時代では、 Xms == Xmx がベストプラクティスではない場合がある
  41. 41. クラウド時代 • 350: Dynamic CDS Archives • 351: ZGC: Uncommit Unused Memory
  42. 42. JEP 353 Reimplement the Legacy Socket API
  43. 43. まず、脱線。。。
  44. 44. JEP 312 (JDK 10) Thread-Local Handshakes 従来の safepoint (STW)
  45. 45. JEP 312 (JDK 10) Thread-Local Handshakes 従来の safepoint (STW) • TLH の実装
  46. 46. Thread-Local Handshakes • 内部実装の変更だけ • 将来バージョンの機能(主に ZGC)の為のもの • 新しいのリリースモデル(6か月ごと) 一つの大規模の変更 -> 複数の小規模の変更
  47. 47. JEP 353 Reimplement the Legacy Socket API • ソケットの実装を書き直しました。 • 主に将来バージョンの機能(Project Loom) のため • 従来の実装よりメンテナンスしやすい
  48. 48. ソケットの新しい実装 • NIO ベース(実績のあるネイティブ実装) • 入出力バッファはスタックで格納されない 普通の off-heap バッファーを利用する • Monitor -> java.util.concurrent のロック
  49. 49. ソケットの新しい実装 • NIO ベース(実績のあるネイティブ実装) • 入出力バッファはスタックで格納されない 普通の off-heap バーファーを利用する • Monitor -> java.util.concurrent のロック
  50. 50. Loom プロジェクト • Loom は j.u.c のロックを使うスレッドの処理を最適する • ソケットの新しい実装は従来より Loom の効果を得られる見込み
  51. 51. 要注意 • 20年以上に渡った従来の実装をリプレースした • 非互換性などの副作用がある 既知問題については JEP をご参考下さい • 一時的な回避策として、jdk.net.usePlainSocketImpl という システムプロパティで従来の実装を利用することが出来る
  52. 52. JEP 12 Preview Language and VM Features
  53. 53. Preview 機能 • 主に仕様の変更や追加 • Java Platform の正式の一部(必須) • 実装は完全(機能の面、品質の面) • 将来になくなる、あるいは、変わる可能性がある
  54. 54. ビルド (JDK 13 の場合) javac Foo.java // preview 機能は利用出来ない javac --release 13 --enable-preview Foo.java // preview 機能は利用出来る javac --release 12 --enable-preview Foo.java // ダメ!バージョンが異なる
  55. 55. 実行 java Foo // preview 機能を利用するクラスをロード出来ない java --enable-preview Foo // 同じ JDK のバージョンの javac でビルドしたクラス (preview 機能有効)をロード出来る
  56. 56. Demo
  57. 57. JEP 354 Switch Expressions (Preview)
  58. 58. Switch Expressions の歴史 • JEP 325: Switch Expressions (Preview) JDK 12 • JEP 354: Switch Expressions (Preview) JDK 13 • JEP 361: Switch Expressions (Standard) JDK 14 ★
  59. 59. Switch Expressions の歴史 • JEP 325: Switch Expressions (Preview) JDK 12 • JEP 354: Switch Expressions (Preview) JDK 13 • JEP 361: Switch Expressions (Standard) JDK 14 ★ ★だといいな。。。
  60. 60. 従来の Switch 文の弱点 • 一つのスコープブロックしかない • フォールスルー • 式として利用出来ない
  61. 61. スコープの問題 switch (day) { case MONDAY: case TUESDAY: int temp = ... // temp のスコープは ‘}’ まで続く break; case WEDNESDAY: case THURSDAY: int temp2 = ... // temp を再利用出来ず break; default: int temp3 = ... // temp を再利用出来ず }
  62. 62. フォールスルー • C / C++ のまま利用されました • システムプログラミングで役に立つユースケースはある • よりハイレベルだと、ユースケースはあまりない • break 文を忘れるバグが非常に多い • break 文のせいでコードが読みにくくなる
  63. 63. int numLetters; switch (day) { case MONDAY: case FRIDAY: case SUNDAY: numLetters = 6; break; case TUESDAY: numLetters = 7; break; case THURSDAY: case SATURDAY: numLetters = 8; break; case WEDNESDAY: numLetters = 9; break; default: throw new IllegalStateException("Wa t: " + day); }
  64. 64. int numLetters; switch (day) { case MONDAY: case FRIDAY: case SUNDAY: numLetters = 6; break; case TUESDAY: numLetters = 7; break; case THURSDAY: case SATURDAY: numLetters = 8; break; case WEDNESDAY: numLetters = 9; break; default: throw new IllegalStateException("Wa t: " + day); }
  65. 65. int numLetters = 式
  66. 66. int numLetters = boolVal ? 13 : 42;
  67. 67. int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; };
  68. 68. int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; };
  69. 69. switch 文から switch 式へ • より読みやすい
  70. 70. int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; };
  71. 71. int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; };
  72. 72. Arrow Labels (矢印のラベル) • フォールスルーなし • switch 式だけではなく、switch 文でも利用可能
  73. 73. switch 文と Arrow Labels static void howMany(int k) { switch (k) { case 1 -> System.out.println("one"); case 2 -> System.out.println("two"); default -> System.out.println("many"); } }
  74. 74. int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; };
  75. 75. 複数のラベル フォールスルーがなければ、不可欠
  76. 76. yield キーワード int result = switch (s) { case "Foo": yield 1; case "Bar": yield 2; default: System.out.println("Neither Foo nor Bar, hmmm..."); yield 0; };
  77. 77. break 42; -> yield 42; • JDK 12 は break 文を利用し、値を返す • Preview のフィードバックによると、混乱しやすかった • JDK 13 では値を返す break が yield でリプレースされた break の従来の振舞は変更ぜす
  78. 78. 値を返す必要性 各アームが値を yield するか、例外をスローする
  79. 79. 値を返す必要性 int i = switch (day) { case MONDAY -> { System.out.println("Monday"); // ダメ!Yield がない } default -> 1; };
  80. 80. 値を返す必要性 int i = switch (day) { case MONDAY, TUESDAY, WEDNESDAY: yield 0; default: System.out.println("Second half of the week"); // ダメ! yield がない! };
  81. 81. JEP 355 Text Blocks (Preview)
  82. 82. Toothpick Syndrome (爪楊枝症候群) Path path = Paths.get("C:¥¥Program Files¥¥foo"); Pattern pattern = Pattern.compile("¥¥¥""); By Superbass - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=44882037
  83. 83. String html = "<html>¥n" + " <body>¥n" + " <p>Hello, world</p>¥n" + " </body>¥n" + "</html>¥n";
  84. 84. String html = """ <html> <body> <p>Hello, world</p> </body> </html> """;
  85. 85. String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`¥n" + "WHERE `CITY` = 'INDIANAPOLIS'¥n" + "ORDER BY `EMP_ID`, `LAST_NAME`;¥n";
  86. 86. String query = """ SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = 'INDIANAPOLIS' ORDER BY `EMP_ID`, `LAST_NAME`; """;
  87. 87. ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval("function hello() {¥n" + " print('¥"Hello, world¥"');¥n" + "}¥n" + "¥n" + "hello();¥n");
  88. 88. ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval(""" function hello() { print('"Hello, world"'); } hello(); """);
  89. 89. • JEP 326: Raw String Literals (Preview) • JEP 355: Text Blocks (Preview) JDK 13 • JEP 368: Text Blocks (Second Preview) JDK 14 ★
  90. 90. • JEP 326: Raw String Literals (Preview) • JEP 355: Text Blocks (Preview) JDK 13 • JEP 368: Text Blocks (Second Preview) JDK 14 ★ ★だといいな。。。
  91. 91. まとめ
  92. 92. JDK 13 • 350: Dynamic CDS Archives • 351: ZGC: Uncommit Unused Memory • 353: Reimplement the Legacy Socket API • 354: Switch Expressions (Preview) • 355: Text Blocks (Preview)
  93. 93. JDK 13 • 350: Dynamic CDS Archives • 351: ZGC: Uncommit Unused Memory • 353: Reimplement the Legacy Socket API • 354: Switch Expressions (Preview) • 355: Text Blocks (Preview)
  94. 94. Thank You!!!

×