More Related Content Similar to JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019] (20) More from David Buck (20) JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]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. 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. 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. 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)
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)
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. 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. Class Data Sharing (JDK 5 以来)
• Java SE のクラスライブラリ(rt.jar) のみ
• jre/lib/[arch]/client/classes.jsa
14. Class Data Sharing (JDK 5 以来)
• Xdump
• -Xshare:dump
• -Xshare:off
• -Xshare:on
• -Xshare:auto (デフォルト)
39. Linux の動作環境
• ZGC は tmpfs か hugetlbfs が利用される
• fallocate() の FALLOC_FL_PUNCH_HOLE サポートが必要
• Tmpfs - Linux 3.5 以降
• Hugetlbfs – Linuc 4.3 以降
40. Xms != Xmx ??
• Xms と Xmx が異ならないかぎり、この機能は動作しない
• クラウド時代では、
Xms == Xmx がベストプラクティスではない場合がある
44. JEP 312 (JDK 10)
Thread-Local Handshakes
従来の safepoint (STW)
45. JEP 312 (JDK 10)
Thread-Local Handshakes
従来の safepoint (STW) • TLH の実装
47. JEP 353
Reimplement the Legacy Socket API
• ソケットの実装を書き直しました。
• 主に将来バージョンの機能(Project Loom) のため
• 従来の実装よりメンテナンスしやすい
54. ビルド (JDK 13 の場合)
javac Foo.java // preview 機能は利用出来ない
javac --release 13 --enable-preview Foo.java
// preview 機能は利用出来る
javac --release 12 --enable-preview Foo.java
// ダメ!バージョンが異なる
55. 実行
java Foo // preview 機能を利用するクラスをロード出来ない
java --enable-preview Foo
// 同じ JDK のバージョンの javac でビルドしたクラス
(preview 機能有効)をロード出来る
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. Switch Expressions の歴史
• JEP 325: Switch Expressions (Preview) JDK 12
• JEP 354: Switch Expressions (Preview) JDK 13
• JEP 361: Switch Expressions (Standard) JDK 14 ★
★だといいな。。。
61. スコープの問題
switch (day) {
case MONDAY:
case TUESDAY:
int temp = ... // temp のスコープは ‘}’ まで続く
break;
case WEDNESDAY:
case THURSDAY:
int temp2 = ... // temp を再利用出来ず
break;
default:
int temp3 = ... // temp を再利用出来ず
}
62. フォールスルー
• C / C++ のまま利用されました
• システムプログラミングで役に立つユースケースはある
• よりハイレベルだと、ユースケースはあまりない
• break 文を忘れるバグが非常に多い
• break 文のせいでコードが読みにくくなる
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. 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);
}
67. int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
68. int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
70. int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
71. int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
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. int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
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. break 42; -> yield 42;
• JDK 12 は break 文を利用し、値を返す
• Preview のフィードバックによると、混乱しやすかった
• JDK 13 では値を返す break が yield でリプレースされた
break の従来の振舞は変更ぜす
79. 値を返す必要性
int i = switch (day) {
case MONDAY -> {
System.out.println("Monday");
// ダメ!Yield がない
}
default -> 1;
};
80. 値を返す必要性
int i = switch (day) {
case MONDAY, TUESDAY, WEDNESDAY:
yield 0;
default:
System.out.println("Second half of the
week");
// ダメ! yield がない!
};
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. String html = "<html>¥n" +
" <body>¥n" +
" <p>Hello, world</p>¥n" +
" </body>¥n" +
"</html>¥n";
84. String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
85. String query =
"SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`¥n" +
"WHERE `CITY` = 'INDIANAPOLIS'¥n" +
"ORDER BY `EMP_ID`, `LAST_NAME`;¥n";
86. String query =
"""
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
87. ScriptEngine engine =
new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("function hello() {¥n" +
" print('¥"Hello, world¥"');¥n" +
"}¥n" +
"¥n" +
"hello();¥n");
88. ScriptEngine engine =
new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("""
function hello() {
print('"Hello, world"');
}
hello();
""");
89. • JEP 326: Raw String Literals (Preview)
• JEP 355: Text Blocks (Preview) JDK 13
• JEP 368: Text Blocks (Second Preview) JDK 14 ★
90. • JEP 326: Raw String Literals (Preview)
• JEP 355: Text Blocks (Preview) JDK 13
• JEP 368: Text Blocks (Second Preview) JDK 14 ★
★だといいな。。。
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. 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)