SlideShare a Scribd company logo
© 2021 NTT DATA Corporation
9/14にリリースされたばかりの新LTS版Java 17
ここ3年間のJavaの変化を知ろう!
2021年9月18日 Open Source Conference 2021 Online Hiroshima
株式会社NTTデータ
阪田 浩一
2
© 2021 NTT DATA Corporation
自己紹介
 株式会社NTTデータ 所属
 Javaチャンピオン
 OpenJDK Author (開発者権限が少しある)
 JVMがとにかく好き
阪田 浩一
jyukutyo
3
© 2021 NTT DATA Corporation
このセミナーの対象と想定している方
 Javaを使っている 学んでいる方
 新バージョンの機能は知らない 追い切れてないなあ…
という方にもぴったりです
© 2020 NTT DATA Corporation
Java 17リリース!
5
© 2021 NTT DATA Corporation
Java 17
 9月14日(米国時間)リリース
 LTSバージョンとしてJava 11以来3年ぶり
 https://openjdk.java.net/projects/jdk/17/
6
© 2021 NTT DATA Corporation
LTS: Long Term Support
 長期サポートバージョン
• バイナリ提供者によって期間が異なる
• 有償サポート契約の場合8年などさらに長期に
• LTS以外のバージョンを数年間有償サポートするベンダも
バージョン 期間
LTS 3年以上
LTS以外 半年
7
© 2021 NTT DATA Corporation
Javaのリリースサイクル
バージョン LTS? リリース日
8 ○ 2014/03
9 2017/09
10 2018/03
11 ○ 2018/09
12 2019/03
13 2019/09
14 2020/03
15 2020/09
16 2021/03
17 ○ 2021/09
10以降リリースが半年ごとに
(3、9月)
LTS以外のサポート期間半年とは
つまり次バージョンのリリースまで
LTSは3年ごと サポート期間も
少なくとも次のLTSまで = 3年
2021年9月最新情報
LTSを2年ごとに変更する提案が…
8
© 2021 NTT DATA Corporation
このセッションでお話する内容
バージョン LTS? リリース日
8 ○ 2014/03
9 2017/09
10 2018/03
11 ○ 2018/09
12 2019/03
13 2019/09
14 2020/03
15 2020/09
16 2021/03
17 ○ 2021/09
8の新機能: ラムダ式
9の新機能: モジュール
LTSの11よりあとの
6バージョン
“Javaプログラムを
書く、実行する”ときに
関わる新機能について
© 2020 NTT DATA Corporation
言語構文編
10
© 2021 NTT DATA Corporation
レコード: Record
 データの入れ物 フィールドを集めただけのクラス
class Customer {
private final long id;
private final String name;
public Customer(long id, String name) {
this.id = id;
this.name = name;
}
// 通常あとgetter, equals, hashCode, toString
定型的、冗長なコード
(LombokやIDEなどを使ったとしても
コードとしては存在する)
11
© 2021 NTT DATA Corporation
レコード: Record
 データの入れ物 フィールドを集めただけのクラス
 上記のような“不変なクラス”は
レコードを使うと簡単に定義できる
record Customer (long id, String name) {}
// コンストラクタ、フィールドの値取得, equals, hashCode, toStringは
// レコードの機能によって定義される
不変なためsetterは存在しない
(フィールドはすべてfinal)
12
© 2021 NTT DATA Corporation
レコードの実体
record Customer (long id, String name) {}
$ javap -private Customer
Compiled from "Customer.java"
final class Customer extends java.lang.Record {
private final long id;
private final java.lang.String name;
Customer(long, java.lang.String);
public final java.lang.String toString();
public final int hashCode();
public final boolean equals(java.lang.Object);
public long id();
public java.lang.String name();
}
13
© 2021 NTT DATA Corporation
レコード: Record
 Java 16 から正式に利用できる
 Java 14: プレビュー
 Java 15: 2ndプレビュー
 Java 16: スタンダード
プレビュー??
14
© 2021 NTT DATA Corporation
Preview、Incubator、Experimental
Preview
完成しているが
標準化はしていない機能
--enable-previewオプション
でプレビュー機能が有効に
Incubator 実験的なAPIやツール
jdk.incubatorで始まる
モジュール
変更、削除の可能性あり
Experimental
ランタイムの
試験的機能
ガベージコレクタや
JITコンパイラなどの新機能
--UnlockExperimentalVMOptions
オプションと対象機能を
有効にするオプションを
付与して実行する
15
© 2021 NTT DATA Corporation
レコード: Record
 Java 16 から正式に利用できる
 Java 14: プレビュー
 Java 15: 2ndプレビュー
 Java 16: スタンダード
プレビューを経る機能は
名称が同じでも各バージョンで
使用方法などが異なる場合があります
16
© 2021 NTT DATA Corporation
レコードのカスタマイズ
 コンストラクタ、メソッドの独自定義もできる
record Customer (long id, String name) {
public Customer {
name += "-San";
}
@Override
public String toString() {
return "Hello " + name;
}
}
jshell> Customer c = new Customer(1, "Sakata")
c ==> Customer[id=1, name=Sakata-San]
コンパクトコンストラクタ:
引数はレコードの宣言順と同じ
記述せずとも引数の値を
フィールドに代入する
17
© 2021 NTT DATA Corporation
JShell
 Javaの対話型ツール、REPL
 Java 9で導入
 ちょっとしたコードや新機能を試すときに便利
$ jshell
| JShellへようこそ -- バージョン17
| 概要については、次を入力してください: /help intro
jshell>
$ jshell --enable-preview
18
© 2021 NTT DATA Corporation
レコードが宣言できる場所
 ローカルレコードクラス
 メソッド内部でレコードを定義できる
 レコードを名前付きのタプルと捉えてもよい
public static void main(String... args) {
record Customer(long id, String name) {}
Customer c = new Customer(1, "Sakata");
}
19
© 2021 NTT DATA Corporation
レコード: Record
 データ格納用の不変なオブジェクトを定義する
 ScalaのケースクラスやKotlinのデータクラスに近い
 JavaBeansとの互換性はない
 レコードの実体はfinalなクラスである
record Customer (long id, String name) {}
// コンストラクタ、フィールドの値取得, equals, hashCode, toStringは
// レコードの機能によって定義される
20
© 2021 NTT DATA Corporation
switch式
 今まであったのはswitch“文”
enum Day { MONDAY, TUESDAY, ...}
Day day = getDay();
String kanji;
switch (day) {
case MONDAY:
kanji = "月";
break;
case TUESDAY:
...
}
文なのでswitchから値は返せない
case節の中で代入する必要があった
21
© 2021 NTT DATA Corporation
switch式
 switch“式”で値を返せる
enum Day { MONDAY, TUESDAY, ...}
Day day = getDay();
String kanji = switch (day) {
case MONDAY:
yield "月";
case TUESDAY:
...
}
値を返すときは
yieldを使う
22
© 2021 NTT DATA Corporation
switch式
 ラムダ式のような書き方もできる
enum Day { MONDAY, TUESDAY, ...}
Day day = getDay();
String kanji = switch (day) {
case MONDAY -> "月";
case TUESDAY -> "火";
...
case FRIDAY, SATURDAY -> "金or土";
}
式の中でcase節の書き方は
どちらかに統一すること
フォールスルーしない
breakが不要になった
23
© 2021 NTT DATA Corporation
switch式
 Java 14 から正式に利用できる
 Java 12: プレビュー
 Java 13: 2ndプレビュー
 Java 14: スタンダード
プレビューは2回という決まりはありません
プレビュー1回のあと標準化する
可能性もあります
24
© 2021 NTT DATA Corporation
instanceofでのパターンマッチ
 Javaにパターンマッチを導入するはじめの一歩
 少しずつパターンマッチのための機能が入っている
// 従来
if (a instanceof String) {
String s = (String) a; // キャストが必要
if (s.length() > 3)
a = s.replaceAll("java", "Java");
}
// instanceofでのパターンマッチ
if (a instanceof String s && s.length() > 3) {
a = s.replaceAll("java", "Java"); // このブロック内では変数sが使える
}
条件式も
組み合わせられる
25
© 2021 NTT DATA Corporation
switchでのパターンマッチ
 instanceofに続きswitchでも同様のことができる
Object o = ...;
String message = switch (o) {
case Integer i -> "int";
case Long l -> "long";
case Double d -> "double";
case String s && s.length() > 3 -> "String";
case null -> "null";
default -> o.toString();
}
Java 17ではまだプレビュー機能
nullにもマッチさせられる
switchにObjectを渡せる
26
© 2021 NTT DATA Corporation
パターンマッチ
 instanceofでのパターンマッチ
 Java 14: プレビュー
 Java 15: 2ndプレビュー
 Java 16: スタンダード
 switchでのパターンマッチ
 Java 17: プレビュー
 Java 18でレコードと配列にも使用できる予定
27
© 2021 NTT DATA Corporation
Sealed Classes: シールクラス
 そのクラスを継承できるクラスを制限する
 子クラスの制限
 インタフェースにも使用可能
 今までは継承可かfinalにして不可にするかのみ
28
© 2021 NTT DATA Corporation
Sealed Classes: シールクラス
public abstract sealed class Shape
permits Circle, Rectangle, WeirdShape { ... }
// これからCircle、Rectangle、WeirdShapeを定義する
 Shapeを継承できるのはpermitsにある上記3クラスのみ
 継承先クラスは以下の選択が必須
 finalクラスにする: これ以降継承禁止となる
 シールクラスにする: さらなる継承を制限する
 nonシールクラスにする: 自由に継承できる
29
© 2021 NTT DATA Corporation
Sealed Classes: シールクラス
public abstract sealed class Shape
permits Circle, Rectangle, WeirdShape { ... }
public final class Circle extends Shape { ... }
public sealed class Rectangle extends Shape
permits TransparentRectangle { ... }
public non-sealed class WeirdShape extends Shape { ... }
30
© 2021 NTT DATA Corporation
Sealed Classes: シールクラス
シールクラスとして継承先を
Circle, Rectangle, WeirdShapeに制限
finalクラスにして
これ以上の継承を禁止
シールクラスとして
このクラスからの
継承もpermitsで制限
non-sealedなので
自由に継承できる
31
© 2021 NTT DATA Corporation
Sealed Classes: シールクラス
public abstract sealed class Shape
permits Circle, Rectangle, WeirdShape { ... }
public final class Circle extends Shape { ... }
public sealed class Rectangle extends Shape
permits TransparentRectangle { ... }
public final class TransparentRectangle extends Rectangle { ... }
public non-sealed class WeirdShape extends Shape { ... }
public class FooShape extends WeirdShape { ... }
32
© 2021 NTT DATA Corporation
Sealed Classes: シールクラス
 そのクラスを継承できるクラスを制限する
 継承先クラスは同一モジュールにあること
• モジュール化していないときは同一パッケージにあること
 Java 17: スタンダード
 Java 15: プレビュー、Java 16: 2ndプレビュー
33
© 2021 NTT DATA Corporation
シースクラスとswitchを組み合わせる
sealed interface S permits A, B, C {}
final class A implements S {}
final class B implements S {}
record C(int i) implements S {} // レコードの実体はfinalクラス
static int testSealedCoverage(S s) {
return switch (s) {
case A a -> 1;
case B b -> 2;
case C c -> 3;
};
}
シールクラスにより継承先がA、B、Cに
限られるため、default節が不要に
インタフェースにも
使用可能
jshell> testSealedCoverage(new B())
$1 ==> 2
34
© 2021 NTT DATA Corporation
最近のJava
 大きな機能が一度に入るのではなく
小さな機能に分かれて数バージョンに渡って入る
 まるで物語における伏線回収のように
いくつかの機能が出揃ったとき
1つの大きな言語機能ができ上がる
35
© 2021 NTT DATA Corporation
テキストブロック
 複数行の文字列リテラル
// SQL
String query = "SELECT "EMP_ID", "LAST_NAME" " +
"FROM "EMPLOYEE_TB"n" +
"WHERE "CITY" = 'INDIANAPOLIS'n" +
"ORDER BY "EMP_ID", "LAST_NAME";n";
// テキストブロックを使う
String query = """
SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
WHERE "CITY" = 'INDIANAPOLIS'
ORDER BY "EMP_ID", "LAST_NAME";
""";
36
© 2021 NTT DATA Corporation
テキストブロック
 改行のエスケープや行末のスペースなど
細かな制御もできる
 interpolation(文字列補間)は範囲外
 “Hello, {name}! ” のようなことはできない
 String#formatted()メソッドを使う
 Java 15で標準に
37
© 2021 NTT DATA Corporation
$ java Sample
Exception in thread "main" java.lang.NullPointerException:
Cannot invoke "String.toString()"
because "Sample.array[0]" is null
at Sample.main(Sample.java:4)
NullPointerExceptionの原因がよりわかりやすく
class Sample {
private static String[] array = { null };
public static void main(String... args) {
array[0].toString();
}
$ java Sample
Exception in thread "main" java.lang.NullPointerException
at Sample.main(Sample.java:4)
Java 14から
38
© 2021 NTT DATA Corporation
StreamにtoList()メソッドを追加
Stream.of("A", "B", "C").map(String::toLowerCase)
.collect(Collectors.toList());
Stream.of("A", "B", "C").map(String::toLowerCase).toList();
Java 16から
 Collectorsを使うことなく
より簡単にListへ変換できる
 変更不可能なListになる
© 2020 NTT DATA Corporation
ランタイム編
40
© 2021 NTT DATA Corporation
ガベージコレクタ
 コレクタの種類の追加(後述)
 G1GCの大幅な改善
 Java 9以降のデフォルトGC
 CMS GCをJava 14で削除
 従来のParallel GCやSerial GCも使用可能
41
© 2021 NTT DATA Corporation
ガベージコレクタとガベージコレクション
 ガベージコレクション
 アプリケーションがもう使用しない
オブジェクト(のメモリ領域)を
再び利用できるようにする(回収する)こと
 ガベージコレクタ
 システムの中で
ガベージコレクションを受け持つ部分のこと
42
© 2021 NTT DATA Corporation
新しいガベージコレクタ
 Java 15で標準化
 ZGC
• Java 11でExperimentalとして導入
 Shenandoah
• Java 12でExperimentalとして導入
• Java 11にバックポート済み
 Java 11で導入
 Epsilon (Experimental)
43
© 2021 NTT DATA Corporation
なぜ新しいガベージコレクタが必要?
 アプリケーションへの要求や実行環境の
多様さに対応するため
 例:テラバイト級のヒープメモリを使用する場合
 例:実行時間が短い場合
44
© 2021 NTT DATA Corporation
ZGC(Java 15以降)
 テラバイト級のヒープを処理できる
 GCでの一時停止時間が最大でも10ms
 スループットの低下も最大15%まで
 リリースごとに改善が進んでいる
 Java 17の時点でZGCは世代別GCではないが
世代別に変更する作業が進んでいる
45
© 2021 NTT DATA Corporation
スループットとレイテンシ
 スループット
 時間あたりの業務処理量
 レイテンシ
 要求を送ってから結果が返ってくるまでの時間
 スループットとレイテンシはトレードオフの関係
 並び立たず
46
© 2021 NTT DATA Corporation
スループットとレイテンシ
 赤の面積の合計(停止時間合計)が
少ないので処理量が多い = 高スループット
 時折処理完了まで長時間かかってしまう
 タイミングによらず短時間で処理できる= 低レイテンシ
 単位時間内の処理量は少なくなってしまう
47
© 2021 NTT DATA Corporation
ZGC(Java 15以降)
 テラバイト級のヒープを処理できる
 GCでの一時停止時間が最大でも10ms
 スループットの低下も最大15%まで
 リリースごとに改善が進んでいる
 Java 17の時点でZGCは世代別GCではないが
世代別に変更する作業が進んでいる
48
© 2021 NTT DATA Corporation
Shenandoah(Java 15以降)
 G1GCと比較してヒープサイズが大きくても
一時停止時間を短く抑えられる
 Oracle JDK、Oracle OpenJDKには含まれない
 レッドハット社が主導して開発した経緯がある
49
© 2021 NTT DATA Corporation
Epsilon(Java 11以降)
 Experimentalな機能
 本番環境ではまだ利用しないこと
 ガベージコレクションをしないガベージコレクタ
 GCによる実行オーバーヘッドの影響をなくす
 試験で使う
 GCがアプリケーションに与える影響を調査する
 実行時間が短いアプリケーションに使う
50
© 2021 NTT DATA Corporation
どのガベージコレクタを使う?
 そのバージョンのデフォルトGCを使う
 Java 9以降はG1GCがデフォルト
 GC系のオプション設定もなしでよい
• JVMがエルゴノミクスにより動的に調整する
 性能を測定しGCが問題と判明すれば変更する
 変更後に再度測定し、必要があれば
オプションを設定してチューニングする
51
© 2021 NTT DATA Corporation
AArch64(Arm 64ビットアーキテクチャ)サポート拡大
 いわゆるM1 Macでも利用可能に
 Windows AArch64はOracle JDK、Oracle OpenJDKにはなく
Microsoft Build of OpenJDKやAzul Zuluで利用可能
OS サポートしたバージョン
Linux Java 9
Windows 16
macOS 17
52
© 2021 NTT DATA Corporation
JVMの実行パフォーマンス改善
 JVMのパフォーマンスは継続的に改善されている
 実行基盤のJavaバージョンを上げるだけで
パフォーマンスが改善する可能性が高い
 LTS間の3年もあると変化量も大きい
 加えてバージョンを上げると情報収集のしやすさや
ツールの機能も増えるため障害解析しやすくなる
• jcmdへの機能追加など
53
© 2021 NTT DATA Corporation
Java 8と17のパフォーマンス比較例
OptaPlanner - How much faster is Java 17? https://www.optaplanner.org/blog/2021/09/15/HowMuchFasterIsJava17.html
ベンチマークでは
平均8.66%の性能向上
© 2020 NTT DATA Corporation
OpenJDK開発編
55
© 2021 NTT DATA Corporation
OpenJDKとJavaの関係
 OpenJDKはJavaのオープンソース実装
 多くのJDKディストリビューションは
OpenJDKのソースをベースにビルドしている
56
© 2021 NTT DATA Corporation
Git、GitHubへの移行
 OpenJDKはGitではなくMercurialを利用していた
 新規開発者への敷居を低くする目的でGitへ移行
 同様にGitHubにリポジトリを移行
 ただしプルリクエストファーストではないので
開発者権限がない場合はメーリングリストへ投稿する
Java 16から
57
© 2021 NTT DATA Corporation
Java 17における組織別issue解決数
The arrival of Java 17! https://blogs.oracle.com/java/post/announcing-java17
58
© 2021 NTT DATA Corporation
新機能はどのように開発されているか
 Javaへの大きな変更(機能追加、削除)は
提案文書としてまとめられている
 JEP: JDK Enhancement Proposal
 OpenJDKコミュニティで議論し実装する
 Java 17では14個のJEPが新たに入った
59
© 2021 NTT DATA Corporation
Java 17
JDK 17 https://openjdk.java.net/projects/jdk/17/
60
© 2021 NTT DATA Corporation
JEPの例
JEP 406: Pattern Matching for
switch (Preview)
https://openjdk.java.net/jeps/406
61
© 2021 NTT DATA Corporation
新機能はどのように開発されているか
 Javaへの小さな変更(機能変更、バグ修正)は
バグ管理システムで扱っている
 JBS: JDK Bug System
 誰でも閲覧可能
 Java 17では2645個のissueを解決
62
© 2021 NTT DATA Corporation
JBS
https://bugs.openjdk.java.net/projects/JDK/issues/
63
© 2021 NTT DATA Corporation
まとめ
 Java 11から3年間で6バージョン
多くの機能追加、改善がなされました
 Java 8からだと9バージョン分!
 今回は言語構文とGC、リポジトリに絞っており、
APIの追加やJVMの機能改善など紹介していない
ことも多くあります
 ぜひ調べて試してみてください!
© 2021 NTT DATA Corporation
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です

More Related Content

PDF
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
NTT DATA Technology & Innovation
 
PDF
TLS, HTTP/2演習
shigeki_ohtsu
 
PDF
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
 
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
 
PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
 
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
NTT DATA Technology & Innovation
 
TLS, HTTP/2演習
shigeki_ohtsu
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
 
Dockerからcontainerdへの移行
Kohei Tokunaga
 

What's hot (20)

PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
 
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PPTX
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
NTT DATA Technology & Innovation
 
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
PDF
BuildKitの概要と最近の機能
Kohei Tokunaga
 
PPTX
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 
PDF
Vacuum徹底解説
Masahiko Sawada
 
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
PDF
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Atsushi Tanaka
 
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
PDF
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
PDF
例外設計における大罪
Takuto Wada
 
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
 
PDF
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
PPTX
Docker Tokyo
cyberblack28 Ichikawa
 
PDF
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Keisuke Takahashi
 
PDF
Docker Compose 徹底解説
Masahito Zembutsu
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
NTT DATA Technology & Innovation
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
BuildKitの概要と最近の機能
Kohei Tokunaga
 
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 
Vacuum徹底解説
Masahiko Sawada
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Atsushi Tanaka
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
例外設計における大罪
Takuto Wada
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
 
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
Docker Tokyo
cyberblack28 Ichikawa
 
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Keisuke Takahashi
 
Docker Compose 徹底解説
Masahito Zembutsu
 
Ad

Similar to 9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 Online Hiroshima 発表資料) (20)

PDF
コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料)
NTT DATA Technology & Innovation
 
PDF
All I learned while working on a Scala OSS project for over six years #ScalaM...
Kazuhiro Sera
 
PPTX
LL2021 Java update
torutk
 
PDF
Flutterを体験してみませんか
cch-robo
 
PDF
ATN No.2 Scala事始め
AdvancedTechNight
 
PDF
Java8から17へ
onozaty
 
PDF
New Features in C# 10/11
Akira Inoue
 
PDF
Scala + Finagleの魅力
Kota Mizushima
 
PDF
Groovy Bootcamp 2015 by JGGUG
Uehara Junji
 
PDF
JJUG 11月ナイトセミナー CDIをはじめよう
Norito Agetsuma
 
PPTX
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
NTT DATA Technology & Innovation
 
PDF
R5 3 type annotation
EIICHI KIMURA
 
PDF
規格書で読むC++11のスレッド
Kohsuke Yuasa
 
PPTX
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
NTT DATA Technology & Innovation
 
PPTX
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
 
PDF
第一回社内 Scala 勉強会(一部抜粋)
lyrical_logical
 
PPTX
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
NTT DATA Technology & Innovation
 
PPTX
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
 
PPTX
Java class design
t_ichioka_sg
 
PDF
JavaScript Tips 2015(PDF 版)
taskie
 
コレクションフレームワーク関連セッション(JavaOne & Devoxx報告会 2022 発表資料)
NTT DATA Technology & Innovation
 
All I learned while working on a Scala OSS project for over six years #ScalaM...
Kazuhiro Sera
 
LL2021 Java update
torutk
 
Flutterを体験してみませんか
cch-robo
 
ATN No.2 Scala事始め
AdvancedTechNight
 
Java8から17へ
onozaty
 
New Features in C# 10/11
Akira Inoue
 
Scala + Finagleの魅力
Kota Mizushima
 
Groovy Bootcamp 2015 by JGGUG
Uehara Junji
 
JJUG 11月ナイトセミナー CDIをはじめよう
Norito Agetsuma
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
NTT DATA Technology & Innovation
 
R5 3 type annotation
EIICHI KIMURA
 
規格書で読むC++11のスレッド
Kohsuke Yuasa
 
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
NTT DATA Technology & Innovation
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
 
第一回社内 Scala 勉強会(一部抜粋)
lyrical_logical
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
NTT DATA Technology & Innovation
 
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
 
Java class design
t_ichioka_sg
 
JavaScript Tips 2015(PDF 版)
taskie
 
Ad

More from NTT DATA Technology & Innovation (20)

PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 

Recently uploaded (11)

PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 

9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 Online Hiroshima 発表資料)

  • 1. © 2021 NTT DATA Corporation 9/14にリリースされたばかりの新LTS版Java 17 ここ3年間のJavaの変化を知ろう! 2021年9月18日 Open Source Conference 2021 Online Hiroshima 株式会社NTTデータ 阪田 浩一
  • 2. 2 © 2021 NTT DATA Corporation 自己紹介  株式会社NTTデータ 所属  Javaチャンピオン  OpenJDK Author (開発者権限が少しある)  JVMがとにかく好き 阪田 浩一 jyukutyo
  • 3. 3 © 2021 NTT DATA Corporation このセミナーの対象と想定している方  Javaを使っている 学んでいる方  新バージョンの機能は知らない 追い切れてないなあ… という方にもぴったりです
  • 4. © 2020 NTT DATA Corporation Java 17リリース!
  • 5. 5 © 2021 NTT DATA Corporation Java 17  9月14日(米国時間)リリース  LTSバージョンとしてJava 11以来3年ぶり  https://openjdk.java.net/projects/jdk/17/
  • 6. 6 © 2021 NTT DATA Corporation LTS: Long Term Support  長期サポートバージョン • バイナリ提供者によって期間が異なる • 有償サポート契約の場合8年などさらに長期に • LTS以外のバージョンを数年間有償サポートするベンダも バージョン 期間 LTS 3年以上 LTS以外 半年
  • 7. 7 © 2021 NTT DATA Corporation Javaのリリースサイクル バージョン LTS? リリース日 8 ○ 2014/03 9 2017/09 10 2018/03 11 ○ 2018/09 12 2019/03 13 2019/09 14 2020/03 15 2020/09 16 2021/03 17 ○ 2021/09 10以降リリースが半年ごとに (3、9月) LTS以外のサポート期間半年とは つまり次バージョンのリリースまで LTSは3年ごと サポート期間も 少なくとも次のLTSまで = 3年 2021年9月最新情報 LTSを2年ごとに変更する提案が…
  • 8. 8 © 2021 NTT DATA Corporation このセッションでお話する内容 バージョン LTS? リリース日 8 ○ 2014/03 9 2017/09 10 2018/03 11 ○ 2018/09 12 2019/03 13 2019/09 14 2020/03 15 2020/09 16 2021/03 17 ○ 2021/09 8の新機能: ラムダ式 9の新機能: モジュール LTSの11よりあとの 6バージョン “Javaプログラムを 書く、実行する”ときに 関わる新機能について
  • 9. © 2020 NTT DATA Corporation 言語構文編
  • 10. 10 © 2021 NTT DATA Corporation レコード: Record  データの入れ物 フィールドを集めただけのクラス class Customer { private final long id; private final String name; public Customer(long id, String name) { this.id = id; this.name = name; } // 通常あとgetter, equals, hashCode, toString 定型的、冗長なコード (LombokやIDEなどを使ったとしても コードとしては存在する)
  • 11. 11 © 2021 NTT DATA Corporation レコード: Record  データの入れ物 フィールドを集めただけのクラス  上記のような“不変なクラス”は レコードを使うと簡単に定義できる record Customer (long id, String name) {} // コンストラクタ、フィールドの値取得, equals, hashCode, toStringは // レコードの機能によって定義される 不変なためsetterは存在しない (フィールドはすべてfinal)
  • 12. 12 © 2021 NTT DATA Corporation レコードの実体 record Customer (long id, String name) {} $ javap -private Customer Compiled from "Customer.java" final class Customer extends java.lang.Record { private final long id; private final java.lang.String name; Customer(long, java.lang.String); public final java.lang.String toString(); public final int hashCode(); public final boolean equals(java.lang.Object); public long id(); public java.lang.String name(); }
  • 13. 13 © 2021 NTT DATA Corporation レコード: Record  Java 16 から正式に利用できる  Java 14: プレビュー  Java 15: 2ndプレビュー  Java 16: スタンダード プレビュー??
  • 14. 14 © 2021 NTT DATA Corporation Preview、Incubator、Experimental Preview 完成しているが 標準化はしていない機能 --enable-previewオプション でプレビュー機能が有効に Incubator 実験的なAPIやツール jdk.incubatorで始まる モジュール 変更、削除の可能性あり Experimental ランタイムの 試験的機能 ガベージコレクタや JITコンパイラなどの新機能 --UnlockExperimentalVMOptions オプションと対象機能を 有効にするオプションを 付与して実行する
  • 15. 15 © 2021 NTT DATA Corporation レコード: Record  Java 16 から正式に利用できる  Java 14: プレビュー  Java 15: 2ndプレビュー  Java 16: スタンダード プレビューを経る機能は 名称が同じでも各バージョンで 使用方法などが異なる場合があります
  • 16. 16 © 2021 NTT DATA Corporation レコードのカスタマイズ  コンストラクタ、メソッドの独自定義もできる record Customer (long id, String name) { public Customer { name += "-San"; } @Override public String toString() { return "Hello " + name; } } jshell> Customer c = new Customer(1, "Sakata") c ==> Customer[id=1, name=Sakata-San] コンパクトコンストラクタ: 引数はレコードの宣言順と同じ 記述せずとも引数の値を フィールドに代入する
  • 17. 17 © 2021 NTT DATA Corporation JShell  Javaの対話型ツール、REPL  Java 9で導入  ちょっとしたコードや新機能を試すときに便利 $ jshell | JShellへようこそ -- バージョン17 | 概要については、次を入力してください: /help intro jshell> $ jshell --enable-preview
  • 18. 18 © 2021 NTT DATA Corporation レコードが宣言できる場所  ローカルレコードクラス  メソッド内部でレコードを定義できる  レコードを名前付きのタプルと捉えてもよい public static void main(String... args) { record Customer(long id, String name) {} Customer c = new Customer(1, "Sakata"); }
  • 19. 19 © 2021 NTT DATA Corporation レコード: Record  データ格納用の不変なオブジェクトを定義する  ScalaのケースクラスやKotlinのデータクラスに近い  JavaBeansとの互換性はない  レコードの実体はfinalなクラスである record Customer (long id, String name) {} // コンストラクタ、フィールドの値取得, equals, hashCode, toStringは // レコードの機能によって定義される
  • 20. 20 © 2021 NTT DATA Corporation switch式  今まであったのはswitch“文” enum Day { MONDAY, TUESDAY, ...} Day day = getDay(); String kanji; switch (day) { case MONDAY: kanji = "月"; break; case TUESDAY: ... } 文なのでswitchから値は返せない case節の中で代入する必要があった
  • 21. 21 © 2021 NTT DATA Corporation switch式  switch“式”で値を返せる enum Day { MONDAY, TUESDAY, ...} Day day = getDay(); String kanji = switch (day) { case MONDAY: yield "月"; case TUESDAY: ... } 値を返すときは yieldを使う
  • 22. 22 © 2021 NTT DATA Corporation switch式  ラムダ式のような書き方もできる enum Day { MONDAY, TUESDAY, ...} Day day = getDay(); String kanji = switch (day) { case MONDAY -> "月"; case TUESDAY -> "火"; ... case FRIDAY, SATURDAY -> "金or土"; } 式の中でcase節の書き方は どちらかに統一すること フォールスルーしない breakが不要になった
  • 23. 23 © 2021 NTT DATA Corporation switch式  Java 14 から正式に利用できる  Java 12: プレビュー  Java 13: 2ndプレビュー  Java 14: スタンダード プレビューは2回という決まりはありません プレビュー1回のあと標準化する 可能性もあります
  • 24. 24 © 2021 NTT DATA Corporation instanceofでのパターンマッチ  Javaにパターンマッチを導入するはじめの一歩  少しずつパターンマッチのための機能が入っている // 従来 if (a instanceof String) { String s = (String) a; // キャストが必要 if (s.length() > 3) a = s.replaceAll("java", "Java"); } // instanceofでのパターンマッチ if (a instanceof String s && s.length() > 3) { a = s.replaceAll("java", "Java"); // このブロック内では変数sが使える } 条件式も 組み合わせられる
  • 25. 25 © 2021 NTT DATA Corporation switchでのパターンマッチ  instanceofに続きswitchでも同様のことができる Object o = ...; String message = switch (o) { case Integer i -> "int"; case Long l -> "long"; case Double d -> "double"; case String s && s.length() > 3 -> "String"; case null -> "null"; default -> o.toString(); } Java 17ではまだプレビュー機能 nullにもマッチさせられる switchにObjectを渡せる
  • 26. 26 © 2021 NTT DATA Corporation パターンマッチ  instanceofでのパターンマッチ  Java 14: プレビュー  Java 15: 2ndプレビュー  Java 16: スタンダード  switchでのパターンマッチ  Java 17: プレビュー  Java 18でレコードと配列にも使用できる予定
  • 27. 27 © 2021 NTT DATA Corporation Sealed Classes: シールクラス  そのクラスを継承できるクラスを制限する  子クラスの制限  インタフェースにも使用可能  今までは継承可かfinalにして不可にするかのみ
  • 28. 28 © 2021 NTT DATA Corporation Sealed Classes: シールクラス public abstract sealed class Shape permits Circle, Rectangle, WeirdShape { ... } // これからCircle、Rectangle、WeirdShapeを定義する  Shapeを継承できるのはpermitsにある上記3クラスのみ  継承先クラスは以下の選択が必須  finalクラスにする: これ以降継承禁止となる  シールクラスにする: さらなる継承を制限する  nonシールクラスにする: 自由に継承できる
  • 29. 29 © 2021 NTT DATA Corporation Sealed Classes: シールクラス public abstract sealed class Shape permits Circle, Rectangle, WeirdShape { ... } public final class Circle extends Shape { ... } public sealed class Rectangle extends Shape permits TransparentRectangle { ... } public non-sealed class WeirdShape extends Shape { ... }
  • 30. 30 © 2021 NTT DATA Corporation Sealed Classes: シールクラス シールクラスとして継承先を Circle, Rectangle, WeirdShapeに制限 finalクラスにして これ以上の継承を禁止 シールクラスとして このクラスからの 継承もpermitsで制限 non-sealedなので 自由に継承できる
  • 31. 31 © 2021 NTT DATA Corporation Sealed Classes: シールクラス public abstract sealed class Shape permits Circle, Rectangle, WeirdShape { ... } public final class Circle extends Shape { ... } public sealed class Rectangle extends Shape permits TransparentRectangle { ... } public final class TransparentRectangle extends Rectangle { ... } public non-sealed class WeirdShape extends Shape { ... } public class FooShape extends WeirdShape { ... }
  • 32. 32 © 2021 NTT DATA Corporation Sealed Classes: シールクラス  そのクラスを継承できるクラスを制限する  継承先クラスは同一モジュールにあること • モジュール化していないときは同一パッケージにあること  Java 17: スタンダード  Java 15: プレビュー、Java 16: 2ndプレビュー
  • 33. 33 © 2021 NTT DATA Corporation シースクラスとswitchを組み合わせる sealed interface S permits A, B, C {} final class A implements S {} final class B implements S {} record C(int i) implements S {} // レコードの実体はfinalクラス static int testSealedCoverage(S s) { return switch (s) { case A a -> 1; case B b -> 2; case C c -> 3; }; } シールクラスにより継承先がA、B、Cに 限られるため、default節が不要に インタフェースにも 使用可能 jshell> testSealedCoverage(new B()) $1 ==> 2
  • 34. 34 © 2021 NTT DATA Corporation 最近のJava  大きな機能が一度に入るのではなく 小さな機能に分かれて数バージョンに渡って入る  まるで物語における伏線回収のように いくつかの機能が出揃ったとき 1つの大きな言語機能ができ上がる
  • 35. 35 © 2021 NTT DATA Corporation テキストブロック  複数行の文字列リテラル // SQL String query = "SELECT "EMP_ID", "LAST_NAME" " + "FROM "EMPLOYEE_TB"n" + "WHERE "CITY" = 'INDIANAPOLIS'n" + "ORDER BY "EMP_ID", "LAST_NAME";n"; // テキストブロックを使う String query = """ SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB" WHERE "CITY" = 'INDIANAPOLIS' ORDER BY "EMP_ID", "LAST_NAME"; """;
  • 36. 36 © 2021 NTT DATA Corporation テキストブロック  改行のエスケープや行末のスペースなど 細かな制御もできる  interpolation(文字列補間)は範囲外  “Hello, {name}! ” のようなことはできない  String#formatted()メソッドを使う  Java 15で標準に
  • 37. 37 © 2021 NTT DATA Corporation $ java Sample Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toString()" because "Sample.array[0]" is null at Sample.main(Sample.java:4) NullPointerExceptionの原因がよりわかりやすく class Sample { private static String[] array = { null }; public static void main(String... args) { array[0].toString(); } $ java Sample Exception in thread "main" java.lang.NullPointerException at Sample.main(Sample.java:4) Java 14から
  • 38. 38 © 2021 NTT DATA Corporation StreamにtoList()メソッドを追加 Stream.of("A", "B", "C").map(String::toLowerCase) .collect(Collectors.toList()); Stream.of("A", "B", "C").map(String::toLowerCase).toList(); Java 16から  Collectorsを使うことなく より簡単にListへ変換できる  変更不可能なListになる
  • 39. © 2020 NTT DATA Corporation ランタイム編
  • 40. 40 © 2021 NTT DATA Corporation ガベージコレクタ  コレクタの種類の追加(後述)  G1GCの大幅な改善  Java 9以降のデフォルトGC  CMS GCをJava 14で削除  従来のParallel GCやSerial GCも使用可能
  • 41. 41 © 2021 NTT DATA Corporation ガベージコレクタとガベージコレクション  ガベージコレクション  アプリケーションがもう使用しない オブジェクト(のメモリ領域)を 再び利用できるようにする(回収する)こと  ガベージコレクタ  システムの中で ガベージコレクションを受け持つ部分のこと
  • 42. 42 © 2021 NTT DATA Corporation 新しいガベージコレクタ  Java 15で標準化  ZGC • Java 11でExperimentalとして導入  Shenandoah • Java 12でExperimentalとして導入 • Java 11にバックポート済み  Java 11で導入  Epsilon (Experimental)
  • 43. 43 © 2021 NTT DATA Corporation なぜ新しいガベージコレクタが必要?  アプリケーションへの要求や実行環境の 多様さに対応するため  例:テラバイト級のヒープメモリを使用する場合  例:実行時間が短い場合
  • 44. 44 © 2021 NTT DATA Corporation ZGC(Java 15以降)  テラバイト級のヒープを処理できる  GCでの一時停止時間が最大でも10ms  スループットの低下も最大15%まで  リリースごとに改善が進んでいる  Java 17の時点でZGCは世代別GCではないが 世代別に変更する作業が進んでいる
  • 45. 45 © 2021 NTT DATA Corporation スループットとレイテンシ  スループット  時間あたりの業務処理量  レイテンシ  要求を送ってから結果が返ってくるまでの時間  スループットとレイテンシはトレードオフの関係  並び立たず
  • 46. 46 © 2021 NTT DATA Corporation スループットとレイテンシ  赤の面積の合計(停止時間合計)が 少ないので処理量が多い = 高スループット  時折処理完了まで長時間かかってしまう  タイミングによらず短時間で処理できる= 低レイテンシ  単位時間内の処理量は少なくなってしまう
  • 47. 47 © 2021 NTT DATA Corporation ZGC(Java 15以降)  テラバイト級のヒープを処理できる  GCでの一時停止時間が最大でも10ms  スループットの低下も最大15%まで  リリースごとに改善が進んでいる  Java 17の時点でZGCは世代別GCではないが 世代別に変更する作業が進んでいる
  • 48. 48 © 2021 NTT DATA Corporation Shenandoah(Java 15以降)  G1GCと比較してヒープサイズが大きくても 一時停止時間を短く抑えられる  Oracle JDK、Oracle OpenJDKには含まれない  レッドハット社が主導して開発した経緯がある
  • 49. 49 © 2021 NTT DATA Corporation Epsilon(Java 11以降)  Experimentalな機能  本番環境ではまだ利用しないこと  ガベージコレクションをしないガベージコレクタ  GCによる実行オーバーヘッドの影響をなくす  試験で使う  GCがアプリケーションに与える影響を調査する  実行時間が短いアプリケーションに使う
  • 50. 50 © 2021 NTT DATA Corporation どのガベージコレクタを使う?  そのバージョンのデフォルトGCを使う  Java 9以降はG1GCがデフォルト  GC系のオプション設定もなしでよい • JVMがエルゴノミクスにより動的に調整する  性能を測定しGCが問題と判明すれば変更する  変更後に再度測定し、必要があれば オプションを設定してチューニングする
  • 51. 51 © 2021 NTT DATA Corporation AArch64(Arm 64ビットアーキテクチャ)サポート拡大  いわゆるM1 Macでも利用可能に  Windows AArch64はOracle JDK、Oracle OpenJDKにはなく Microsoft Build of OpenJDKやAzul Zuluで利用可能 OS サポートしたバージョン Linux Java 9 Windows 16 macOS 17
  • 52. 52 © 2021 NTT DATA Corporation JVMの実行パフォーマンス改善  JVMのパフォーマンスは継続的に改善されている  実行基盤のJavaバージョンを上げるだけで パフォーマンスが改善する可能性が高い  LTS間の3年もあると変化量も大きい  加えてバージョンを上げると情報収集のしやすさや ツールの機能も増えるため障害解析しやすくなる • jcmdへの機能追加など
  • 53. 53 © 2021 NTT DATA Corporation Java 8と17のパフォーマンス比較例 OptaPlanner - How much faster is Java 17? https://www.optaplanner.org/blog/2021/09/15/HowMuchFasterIsJava17.html ベンチマークでは 平均8.66%の性能向上
  • 54. © 2020 NTT DATA Corporation OpenJDK開発編
  • 55. 55 © 2021 NTT DATA Corporation OpenJDKとJavaの関係  OpenJDKはJavaのオープンソース実装  多くのJDKディストリビューションは OpenJDKのソースをベースにビルドしている
  • 56. 56 © 2021 NTT DATA Corporation Git、GitHubへの移行  OpenJDKはGitではなくMercurialを利用していた  新規開発者への敷居を低くする目的でGitへ移行  同様にGitHubにリポジトリを移行  ただしプルリクエストファーストではないので 開発者権限がない場合はメーリングリストへ投稿する Java 16から
  • 57. 57 © 2021 NTT DATA Corporation Java 17における組織別issue解決数 The arrival of Java 17! https://blogs.oracle.com/java/post/announcing-java17
  • 58. 58 © 2021 NTT DATA Corporation 新機能はどのように開発されているか  Javaへの大きな変更(機能追加、削除)は 提案文書としてまとめられている  JEP: JDK Enhancement Proposal  OpenJDKコミュニティで議論し実装する  Java 17では14個のJEPが新たに入った
  • 59. 59 © 2021 NTT DATA Corporation Java 17 JDK 17 https://openjdk.java.net/projects/jdk/17/
  • 60. 60 © 2021 NTT DATA Corporation JEPの例 JEP 406: Pattern Matching for switch (Preview) https://openjdk.java.net/jeps/406
  • 61. 61 © 2021 NTT DATA Corporation 新機能はどのように開発されているか  Javaへの小さな変更(機能変更、バグ修正)は バグ管理システムで扱っている  JBS: JDK Bug System  誰でも閲覧可能  Java 17では2645個のissueを解決
  • 62. 62 © 2021 NTT DATA Corporation JBS https://bugs.openjdk.java.net/projects/JDK/issues/
  • 63. 63 © 2021 NTT DATA Corporation まとめ  Java 11から3年間で6バージョン 多くの機能追加、改善がなされました  Java 8からだと9バージョン分!  今回は言語構文とGC、リポジトリに絞っており、 APIの追加やJVMの機能改善など紹介していない ことも多くあります  ぜひ調べて試してみてください!
  • 64. © 2021 NTT DATA Corporation 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です