JDK12で新しく導入される言語機能とAPI

 きしだ氏によるJDK12で新しく導入される言語機能とAPIの紹介があった。 Qiitaの記事(Java12新機能まとめ)も交え、解説があった。 JDK12にはプログラムを書く上で大きな変更は入っていないとのこと。

swith構文の拡張

 本機能はpreviw機能なので、まだ暫定とのこと。 まだ、お仕事で使わないように気を付ける必要あり。 コンパイル時に --enable-preview を指定しなければ利用できないので、 とりあえず安心。

 アロー構文でswitch分を書くことができる。 そして、 break が不要になる。

String time = switch (weekday) {
  case MONDAY, FRIDAY -> "10:00-18:00";
  case TUESDAY, THURSDAY -> "10:00-14:00";
  default -> "休日";
};

 また、 break に返り値を設定することもできるようになりそう。 ここは、まだ揺らぐ可能性が高い。

String time = switch (weekday) {
  case MONDAY, FRIDAY ->  {
    var endTime = getEndTime();
    break "10:00-" + endTime;
  }
  case TUESDAY, THURSDAY -> "10:00-14:00";
  default -> "休日";
};

JVM Constants API

 パッケージ(java.lang.constant )に追加された。 リフレクションで色々とやるときに便利になるとのこと。

実装時に使いそうな新機能

  • Collectors.teeing
    • 二つのCollectorを使いたいときに利用する。
// ここのサンプルを書ききれなかった。
// String str = Stream.of("aa","bb").collect(Collectors)
  • String.transform
    • 直観的に値を取得できるような気がする。
var address    = Map.of("john","tokyo","mike","fukuoka");
var population = Map.of("tokyo", 30000000, "fukuoka", 2000000);
"john".transform(addresses::get).transform(population::get)
  • String.indent
    • インデントを入れることができる。
    • マイナスの値も入れることができる。
"123\n456".indent(2)
// "  123\n  456\n"
  • CompactNumberFormat
    • ロケールに応じて、数字を丸めてくれる。
var cnf = NumberFormat.getCompactNumberInstance();
cnf.format(10000_0000); // "1億"
  • InputStream.skipNBytes
    • 指定したバイトだけスキップすることができる。

JDK13に入りそうなもの

 すべては未確定。

JDK12新機能解説

 David Buck氏によるZGCの解説をいただく。

ZGCって何

 JDK11以降の新しいGCの実装のこと。 A Scalable Low-Latency Garbage Collector。

 複数のTBのヒープに対応でき、 10ms以下の停止時間を目指し、 チューニングが楽で、 15%以下のオーバーヘッド。

  • "Z" GC
    • "ZFS(Zettabyte(==1000^7 byte: 10億) File System)"
  • Zettabyte != Zebibyte

ZGCの特徴

 ヒープと生存データのサイズが停止時間に影響を及ぼさない。 ルート参照(ヒープの外からヒープへのアクセス)の数が停止時間に影響を及ぼす。

パフォーマンス

  • メモリ128GBで2ms以下のGC Time

チューニング

  • -Xmx<size>
  • (必要に応じて) -XX:ConcGCThreads=<number>

ログ出力

  • -Xlog:gc
  • -Xlog:gc*

ロードマップ

  • 短期
    • 正式サポート
  • 長期
    • 世代別
    • 1ms以下の停止時間
    • 他のプラットフォームのサポート
    • Graal JITの対応