Slide 1

Slide 1 text

Java SEの動向 2022夏版 Java仕様勉強会 2022年 9月21日 1

Slide 2

Slide 2 text

これまでのJava 2 Java SEの動向 バージョンの推移 2019 2020 2021 2022 11 12 13 14 15 16 17 18 19 20 2023 最新 LTS 最新版 次期

Slide 3

Slide 3 text

Javaの仕様 ● Java 言語仕様 (JLS) ● Java 仮想マシン仕様 (JVMS) ● Java Specification Requests (JSR) ● JDK Enhancement Proposals (JEP) 3 Java SEの動向 さまざまな仕様

Slide 4

Slide 4 text

Javaの仕様 ● Java 言語仕様 (JLS) ● Java 仮想マシン仕様 (JVMS) 4 Java SEの動向 実装の種類 OpenJDK OpenJ9 GraalVM 実装

Slide 5

Slide 5 text

Javaを提供しているベンダー 5 Java SEの動向 Eclipse Temurin Red Hat Build of OpenJDK Sap Machine OracleJDK Oracle OpenJDK Azul Zulu Liberica JDK Microsoft Build of OpenJDK Amazon Corretto Mandrel GraalVM CE GraalVM EE Eclipse OpenJ9 IBM OpenJ9 OpenJDK OpenJ9 GraalVM

Slide 6

Slide 6 text

ここ数年の進化 6 Java SEの動向 Java 11 ~ 16 11 12 13 14 15 16 ● 181: Nest-Based Access Control ● 309: Dynamic Class-File Constants ● 315: Improve Aarch64 Intrinsics ● 318: Epsilon: A No-Op Garbage Collector ● 320: Remove the Java EE and CORBA Modules ● 321: HTTP Client (Standard) ● 323: Local-Variable Syntax for Lambda Parameters ● 324: Key Agreement with Curve25519 and Curve448 ● 327: Unicode 10 ● 328: Flight Recorder ● 329: ChaCha20 and Poly1305 Cryptographic Algorithms ● 330: Launch Single-File Source-Code Programs ● 331: Low-Overhead Heap Profiling ● 332: Transport Layer Security (TLS) 1.3 ● 333: ZGC: A Scalable Low-Latency Garbage Collector(Experimental) ● 335: Deprecate the Nashorn JavaScript Engine ● 336: Deprecate the Pack200 Tools and API ● 305: Pattern Matching for instanceof (Preview) ● 343: Packaging Tool (Incubator) ● 345: NUMA-Aware Memory Allocation for G1 ● 349: JFR Event Streaming ● 352: Non-Volatile Mapped Byte Buffers ● 358: Helpful NullPointerExceptions ● 359: Records (Preview) ● 361: Switch Expressions (Standard) ● 362: Deprecate the Solaris and SPARC Ports ● 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector ● 364: ZGC on macOS ● 365: ZGC on Windows ● 366: Deprecate the ParallelScavenge + SerialOld GC Combination ● 367: Remove the Pack200 Tools and API ● 368: Text Blocks (Second Preview) ● 370: Foreign-Memory Access API (Incubator) ● 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) ● 230: Microbenchmark Suite ● 325: Switch Expressions (Preview) ● 334: JVM Constants API ● 340: One AArch64 Port, Not Two ● 341: Default CDS Archives ● 344: Abortable Mixed Collections for G1 ● 346: Promptly Return Unused Committed Memory from G1 ● 339: Edwards-Curve Digital Signature Algorithm (EdDSA) ● 360: Sealed Classes (Preview) ● 371: Hidden Classes ● 372: Remove the Nashorn JavaScript Engine ● 373: Reimplement the Legacy DatagramSocket API ● 374: Disable and Deprecate Biased Locking ● 375: Pattern Matching for instanceof (Second Preview) ● 377: ZGC: A Scalable Low-Latency Garbage Collector ● 378: Text Blocks ● 379: Shenandoah: A Low-Pause-Time Garbage Collector ● 381: Remove the Solaris and SPARC Ports ● 383: Foreign-Memory Access API (Second Incubator) ● 384: Records (Second Preview) ● 385: Deprecate RMI Activation for Removal ● 350: Dynamic CDS Archives ● 351: ZGC: Uncommit Unused Memory ● 353: Reimplement the Legacy Socket API ● 354: Switch Expressions (Preview) ● 355: Text Blocks (Preview) ● 338: Vector API (Incubator) ● 347: Enable C++14 Language Features ● 357: Migrate from Mercurial to Git ● 369: Migrate to GitHub ● 376: ZGC: Concurrent Thread-Stack Processing ● 380: Unix-Domain Socket Channels ● 386: Alpine Linux Port ● 387: Elastic Metaspace ● 388: Windows/AArch64 Port ● 389: Foreign Linker API (Incubator) ● 390: Warnings for Value-Based Classes ● 392: Packaging Tool ● 393: Foreign-Memory Access API (Third Incubator) ● 394: Pattern Matching for instanceof ● 395: Records ● 396: Strongly Encapsulate JDK Internals by Default ● 397: Sealed Classes (Second Preview)

Slide 7

Slide 7 text

ここ数年の進化 7 Java SEの動向 Java 17以降 17 18 19 ● 306: Restore Always-Strict Floating-Point Semantics ● 356: Enhanced Pseudo-Random Number Generators ● 382: New macOS Rendering Pipeline ● 391: macOS/AArch64 Port ● 398: Deprecate the Applet API for Removal ● 403: Strongly Encapsulate JDK Internals ● 406: Pattern Matching for switch (Preview) ● 407: Remove RMI Activation ● 409: Sealed Classes ● 410: Remove the Experimental AOT and JIT Compiler ● 411: Deprecate the Security Manager for Removal ● 412: Foreign Function & Memory API (Incubator) ● 414: Vector API (Second Incubator) ● 415: Context-Specific Deserialization Filters ● 400: UTF-8 by Default ● 408: Simple Web Server ● 413: Code Snippets in Java API Documentation ● 416: Reimplement Core Reflection with Method Handles ● 417: Vector API (Third Incubator) ● 418: Internet-Address Resolution SPI ● 419: Foreign Function & Memory API (Second Incubator) ● 420: Pattern Matching for switch (Second Preview) ● 421: Deprecate Finalization for Removal ● 405: Record Patterns (Preview) ● 422: Linux/RISC-V Port ● 424: Foreign Function & Memory API (Preview) ● 425: Virtual Threads (Preview) ● 426: Vector API (Fourth Incubator) ● 427: Pattern Matching for switch (Third Preview) ● 428: Structured Concurrency (Incubator) 参考: https://openjdk.org/projects/jdk/11/ https://openjdk.org/projects/jdk/12/ https://openjdk.org/projects/jdk/13/ https://openjdk.org/projects/jdk/14/ https://openjdk.org/projects/jdk/15/ https://openjdk.org/projects/jdk/16/ https://openjdk.org/projects/jdk/17/ https://openjdk.org/projects/jdk/18/ https://openjdk.org/projects/jdk/19/

Slide 8

Slide 8 text

Javaのプロジェクト ● プロジェクトはJavaの進化の大きな方向性を決めている ● プロジェクトは検討した内容を少しずつ JEPとして進めている ● 1つ以上のグループがスポンサーをする ● Webコンテンツ、リポジトリ、メーリングリストを持つ 8 Java SEの動向 概要

Slide 9

Slide 9 text

Javaのプロジェクト 9 Java SEの動向 活動中のプロジェクト 仮想マシン ● Project Leyden ● Project Lilliput ● Portola Project ● CRaC UI ● OpenJFX Project ● Wakefield 可観測性 ● JDK Mission Control ● VisualVM GC ● Shenandoah ● ZGC 大型プロジェクト ● Project Amber ● Project Loom ● Project Panama ● Project Valhalla

Slide 10

Slide 10 text

10 各プロジェクトの紹介 10

Slide 11

Slide 11 text

Project Amber ● ゴール ○ Java言語の改革 ○ 生産性を重視した小規模なJava言語機能を調査・改善 ● スポンサー ○ コンパイラ・グループ 11 Java SEの動向 概要 Project Amber: https://openjdk.org/projects/amber/ ● 特徴 ○ 少なくとも2回プレビュー ○ JEPだけではなく、ガイドや設計メモが公開

Slide 12

Slide 12 text

Project Amber 12 Java SEの動向 JEPs Project Amber: https://openjdk.org/projects/amber/ JEP番号 名称 ステータス リリース 427 Pattern Matching for switch (Third Preview) リリース済み 19 405 Record Patterns and Array Patterns (Preview) リリース済み 19 420 Pattern Matching for switch (Second Preview) リリース済み 18 409 Sealed Classes リリース済み 17 406 Pattern Matching for switch (Preview) リリース済み 17 395 Records リリース済み 16 394 Pattern Matching for instanceof リリース済み 16 397 Sealed Classes (Second Preview) リリース済み 16 378 Text Blocks リリース済み 15 384 Records (Second Preview) リリース済み 15 375 Pattern Matching for instanceof (Second Preview) リリース済み 15 360 Sealed Classes (Preview) リリース済み 15

Slide 13

Slide 13 text

Project Amber 13 Java SEの動向 JEPs Project Amber: https://openjdk.org/projects/amber/ JEP番号 名称 ステータス リリース 361 Switch Expressions リリース済み 14 368 Text Blocks (Second Preview) リリース済み 14 359 Records (Preview) リリース済み 14 305 Pattern Matching for instanceof (Preview) リリース済み 14 355 Text Blocks (Preview) リリース済み 13 354 Switch Expressions (Second Preview) リリース済み 13 325 Switch Expressions (Preview) リリース済み 12 323 Local-Variable Syntax for Lambda Parameters リリース済み 11 286 Local-Variable Type Inference リリース済み 10 302 Lambda Leftovers 候補 - 348 Java Compiler Intrinsics for JDK APIs 候補 - 301 Enhanced Enums クローズ/差し戻し - 326 Raw String Literals クローズ/差し戻し -

Slide 14

Slide 14 text

Project Amber 14 Java SEの動向 改善ポイント Project Amber: https://openjdk.org/projects/amber/ Object o; System.out.println(switch (o) { case String s && s.length() >= 5 -> s.toUpperCase(); case String s -> " %s ".formatted(s); case Integer i -> "%,d".formatted(i); default -> o.toString(); } Pattern Matching for switch (Second Preview) public abstract sealed class Shape permits Circle, Rectangle, Square {...} Sealed Classes record Foo(int x, int y) {} Records if (x instanceof Integer i) { // ここで i を使用できる } Pattern Matching for instanceof var str = """ You can write two line string. """; Text Blocks int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; Switch Expressions var a = "Foo"; Local-Variable Type Inference

Slide 15

Slide 15 text

Project Valhalla 15 Java SEの動向 概要 Project Valhalla: https://openjdk.org/projects/valhalla/ ● ゴール ○ Javaのオブジェクトモデルを、値オブジェクトと ユーザー定義プリミティブで補強 ○ オブジェクト指向プログラミングの抽象化と 単純なプリミティブの性能特性を組み合わせること ● スポンサー ○ HotSpotグループ ● 特徴 ○ ジェネリクスAPIによる性能向上を維持するために、 Javaの ジェネリクスへの変更で補完 ○ 以前は Value Types と言ってたものが、 inline-types に 名前を変えた

Slide 16

Slide 16 text

Project Valhalla 16 Java SEの動向 JEPs JEP番号 名称 ステータス リリース 181 Nest-Based Access Control リリース済み 11 309 Dynamic Class-File Constants リリース済み 11 371 Hidden Classes リリース済み 15 390 Warnings for Value-Based Classes リリース済み 16 401 Primitive Classes (Preview) 候補 - 402 Classes for the Basic Primitives (Preview) 候補 - - Better-defined JVM class file validation 下書き - - Value Objects (Preview) 下書き - - Universal Generics (Preview) 下書き - - Parametric JVM 下書き作成中 - Project Valhalla: https://openjdk.org/projects/valhalla/

Slide 17

Slide 17 text

Project Valhalla 17 Java SEの動向 改善ポイント Project Valhalla: https://openjdk.org/projects/valhalla/ primitive class Point implements Shape { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double x() { return x; } public double y() { return y; } public Point translate(double dx, double dy) { return new Point(x+dx, y+dy); } public boolean contains(Point p) { return equals(p); } } Primitive Classes jshell> synchronized (LocalDateTime.now()){} | 警告: | 値ベース・クラスのインスタンスで同期しようとしました | synchronized (LocalDateTime.now()){} | ^----------------------------------^ Warnings for Value-Based Classes 値ベースのクラス例 ● java.langパッケージのプリミティブラッパークラス ● java.lang.Runtime.Versionのクラス ● java.utilパッケージの Optinal 関連のクラス ● java.time API の日時関連のクラス ● java.lang.ProcessHandle インターフェースとその実装クラス ● java.util パッケージのコレクションクラスの実装クラス

Slide 18

Slide 18 text

Project Loom 18 Java SEの動向 概要 Project Loom: https://openjdk.org/projects/loom/ ● ゴール ○ 使いやすく、高スループットの軽量並行処理や新しいプログ ラミングモデルをサポートすること ● スポンサー ○ HotSpotグループ ● 特徴 ○ 軽量なユーザモードスレッド ○ 限定継続 ○ 明示的な末尾呼び出し

Slide 19

Slide 19 text

Project Loom 19 Java SEの動向 JEPs Project Loom: https://openjdk.org/projects/loom/ JEP番号 名称 ステータス リリース 425 Virtual Threads (Preview) リリース済み 19 428 Structured Concurrency (Incubator) リリース済み 19

Slide 20

Slide 20 text

Project Loom 20 Java SEの動向 改善ポイント Project Loom: https://openjdk.org/projects/loom/ Response handle() throws ExecutionException, InterruptedException { try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Future user = scope.fork(() -> findUser()); Future order = scope.fork(() -> fetchOrder()); scope.join(); // 両フォークが終了するのを待機します scope.throwIfFailed(); // エラーを伝播します // 両フォークが成功したら、その結果を返します。 return new Response(user.resultNow(), order.resultNow()); } } Structured Concurrency (Incubator) try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); return i; }); } // executor.close() は暗黙的に呼ばれて、待ちます Virtual Threads (Preview)

Slide 21

Slide 21 text

Project Panama 21 Java SEの動向 概要 Project Panama: https://openjdk.org/projects/panama/ ● ゴール ○ Java仮想マシンと明確に定義された( Javaではない)外部 APIとの間の接続を改善 ● スポンサー ○ Hotspotグループ ● 特徴 ○ JVMからのネイティブ関数とデータの呼び出し ○ JVMの新しいデータレイアウト、ネイティブ メタデータ ○ ネイティブ・ライブラリ管理 ○ ネイティブとJVM側の "フック" ○ ネイティブ指向のJIT最適化 ○ 安全性のためのツールやラッパー

Slide 22

Slide 22 text

Project Panama 22 Java SEの動向 JEPs JEP番号 名称 ステータス リリース 424 Foreign Function & Memory API (Preview) リリース済み 19 426 Vector API (Fourth Incubator) リリース済み 19 419 Foreign Function & Memory API (Second Incubator) リリース済み 18 417 Vector API (Third Incubator) リリース済み 18 412 Foreign Function & Memory API (Incubator) リリース済み 17 414 Vector API (Second Incubator) リリース済み 17 389 Foreign Linker API (Incubator) リリース済み 16 338 Vector API (Incubator) リリース済み 16 393 Foreign-Memory Access API (Third Incubator) リリース済み 16 383 Foreign-Memory Access API (Second Incubator) リリース済み 15 370 Foreign-Memory Access API (Incubator) リリース済み 14 Project Panama: https://openjdk.org/projects/panama/

Slide 23

Slide 23 text

Project Panama 23 Java SEの動向 改善ポイント Project Panama: https://openjdk.org/projects/panama/ static final VectorSpecies SPECIES = FloatVector.SPECIES_256; void vectorComputation(float[] a, float[] b, float[] c) { for (int i = 0; i < a.length; i += SPECIES.length()) { VectorMask m = SPECIES.indexInRange(i, a.length); FloatVector va = FloatVector.fromArray(SPECIES, a, i, m); FloatVector vb = FloatVector.fromArray(SPECIES, b, i, m); FloatVector vc = va.mul(va). add(vb.mul(vb)). neg(); vc.intoArray(c, i, m); } } Vector API try (MemorySegment segment = MemorySegment.allocateNative(100)) { for (int i = 0 ; i < 25 ; i++) { MemoryAccess.setIntAtOffset(i * 4, i); } } Foreign Function & Memory API (Second Incubator)

Slide 24

Slide 24 text

24 Java 仮想マシン 24

Slide 25

Slide 25 text

Project Leyden 25 Java SEの動向 概要 Project Leyden: https://openjdk.org/projects/leyden/ ● ゴール ○ Javaの起動時間とピーク性能までの時間の遅さ、および フットプリントの大きさという長期的な問題点に対処 ○ サイズや起動時間の点でネイティブ実行と遜色ないようにす る ○ GCやツールを全てサポート ● スポンサー ○ HotSpot と コアライブラリ・グループ ● 特徴 ○ 静的イメージの概念を導入 ○ 静的イメージはアプリケーション由来のスタンドアロンプログ ラム ○ 静的イメージは実行時にクラスのロードや生成はできない

Slide 26

Slide 26 text

Project Lilliput 26 Java SEの動向 概要 Project Lilliput: https://wiki.openjdk.org/display/lilliput ● ゴール ○ メモリフットプリントを削減し、パフォーマンス向上 ● スポンサー ○ HotSpotグループ ● 特徴 ○ オブジェクトヘッダを128ビットから64ビットへ小型化 ○ 32ビットを目指せるかもしれない ○ ヘッドレイアウトを柔軟にし、ビルド時や起動時にビットの使 い方を設定できるようにする

Slide 27

Slide 27 text

Project Lilliput 27 Java SEの動向 モチベーション Project Lilliput: https://wiki.openjdk.org/display/lilliput ● 64bit HotspotではJavaオブジェクトは多目的ヘッダ(64bit)とクラスポインタ(64bit)を持つ ● 典型的なオブジェクトの平均サイズ(ヘッダ含む)は 5~6 ワード(内ヘッダは上記2ワード) ● ヘッダを小さくすることで大規模なアプリも、コンテナなど小規模なアプリでも効率よくできる ● 以下を実現可能にする ○ ヒープ使用量の削減 ○ オブジェクトの割り当て率の向上 ○ GCの削減 ○ CPUキャッシュの向上

Slide 28

Slide 28 text

Portola Project 28 Java SEの動向 概要 Portola Project: https://openjdk.org/projects/portola/ ● ゴール ○ Alpine Linux へのJDKの移植 特にmusl Cライブラリへの移植 ● スポンサー ○ Portersグループ ● 特徴 ○ 非常に軽量な Linux でも動くようにする ○ コンテナなど軽量が好ましい技術と組み合わせやすい

Slide 29

Slide 29 text

CRaC Project 29 Java SEの動向 概要 CRaC Project: https://wiki.openjdk.org/display/crac ● ゴール ○ Javaプログラムの実行中にJavaインスタンスを チェックポイント (イメージ化やスナップショット) する仕組み で、Javaプログラムの連携を研究 ● スポンサー ○ HotSpot グループ ● 特徴 ○ 起動時の問題を解決するために、イメージから復元 ○

Slide 30

Slide 30 text

30 可観測性 30

Slide 31

Slide 31 text

Mission Control Project 31 Java SEの動向 概要 JDK Mission Control: https://openjdk.org/projects/jmc/ ● ゴール ○ OpenJDK および Oracle JDK 用のツール群で、本番環境 を対象としたプロファイリングと診断に焦点 ● スポンサー ○ HotSpotグループ ● 特徴 ○ JDK Flight Recorderが生成した記録を参照するために使 用されるクライアントツール ○ JDK Mission Controlには、他にもJMXコンソールや HPROF-dumpアナライザーなどのツールも含まれる

Slide 32

Slide 32 text

VisualVM Project 32 Java SEの動向 概要 VisualVM Project: https://openjdk.org/projects/visualvm/ ● ゴール ○ VisualVMを作成するプロジェクト ● スポンサー ○ JMXグループ ● 特徴 ○ Java 1.4から使える

Slide 33

Slide 33 text

33 ユーザインターフェース 33

Slide 34

Slide 34 text

OpenJFX Project 34 Java SEの動向 概要 OpenJFX Project: https://openjdk.org/projects/openjfx/ ● ゴール ○ 次世代Javaクライアントツールキットを構築すること ● スポンサー ○ Swingグループ ● 特徴 ○ 現代的で効率的、そして完全な機能を備えたツールキットを 生み出す

Slide 35

Slide 35 text

Wakefield 35 Java SEの動向 概要 Wakefield: https://openjdk.org/projects/wakefield/ ● ゴール ○ Waylandディスプレイサーバーのサポートを実現する ● スポンサー ○ クライアント・ライブラリ・グループ ● 特徴 ○ Wayland上でX11互換モードでJDKを動作させるための短 中期的な解決策 ○ WaylandのネイティブクライアントとしてJDKを動作させる ための中長期的な解決策

Slide 36

Slide 36 text

36 ガベージ・コレクション 36

Slide 37

Slide 37 text

Shenandoah 37 Java SEの動向 概要 Shenandoah: https://openjdk.org/projects/shenandoah/ ● ゴール ○ 超低休止時間で、実行中の業務処理と並行して多くの GC 作業を行うことで、GCによる休止時間を短縮 ● スポンサー ○ HotSpotグループ ● JEP ○ 189: Shenandoah GC ● 特徴 ○ オブジェクトの並行マーキングを行う CMSとG1に 加え、Shenandoahは並行コンパクションを追加 ○ 休止時間はヒープサイズに正比例しない

Slide 38

Slide 38 text

ZGC 38 Java SEの動向 概要 ZGC: https://openjdk.org/projects/zgc/ ● ゴール ○ 拡張性に富み、低遅延のGC ● スポンサー ○ HotSpotグループ ● JEP ○ 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental) ○ 377: ZGC: A Scalable Low-Latency Garbage Collector (Production) ● 特徴 ○ 8MBから16TBのヒープを扱える ○ 最大停止時間はms未満を目指す ○ 並行処理、リージョンベース、コンパクティング、 NUMAを意 識、カラーポインタとロードバリアを利用

Slide 39

Slide 39 text

39 Red Hat is the world’s leading provider of enterprise open source software solutions. Award-winning support, training, and consulting services make Red Hat a trusted adviser to the Fortune 500. Thank you