Slide 1

Slide 1 text

Valhalla で、 の って どうなったの? Value Class Java in the Box 櫻庭 祐一

Slide 2

Slide 2 text

Project Valhalla Value Class Null-Restriced Nullable Type Primitive 拡張 Specialized Generics

Slide 3

Slide 3 text

Project Valhalla Value Class Null-Restriced Nullable Type Primitive 拡張 Specialized Generics

Slide 4

Slide 4 text

Java の 2 つの型 Primitive Type Reference Type ビルトイン ユーザー定義 NonNull Nullable Monomorphic Polymorphic 初期化不要 初期化必要

Slide 5

Slide 5 text

double p[] = {0.0, 1.0, 2.0, 3.0}; p [0] [1] [2] [3] 0.0 2.0 4.0 6.0

Slide 6

Slide 6 text

record Point(double x, double y) {} Point points[] = {new Ponit(0.0, 0.0), .....}; points [0] [1] [2] [3] Point x y 0.0 0.0 Point x y 1.0 2.0 Point x y 3.0 2.0 Point x y 4.0 4.0

Slide 7

Slide 7 text

CPU のメモリ構成 Register Main Memory L1 Cache L2 Cache L3 Cache 容量 Small Large 10 byte 2 10 3 10 6 10 7 10 ~ 9 速度 Fast Slow 1 cycle 4 10-15 20-50 100 ~

Slide 8

Slide 8 text

CPU のメモリ構成 データがキャッシュにない キャッシュミス キャッシュへのロードはチャンクで行われる まとめて使われるデータは近くに配置する

Slide 9

Slide 9 text

for (var p: points) { // p Λ࢖ͬͨॲཧ } points [0] [1] [2] [3] Point x y 0.0 0.0 Point x y 4.0 4.0 Point x y 1.0 2.0 Point x y 3.0 2.0 キャッシュミス多発

Slide 10

Slide 10 text

for (var p: points) { // p Λ࢖ͬͨॲཧ } points [0].x 0.0 [0].y 0.0 [1].x 1.0 [1].y 2.0 [2].x 3.0 [2].y 2.0 [3].x 4.0 [3].y 4.0

Slide 11

Slide 11 text

Primitive Type Reference Type New Type?? 求められるのは Codes like a Class Works like an int

Slide 12

Slide 12 text

Primitive Type Reference Type Value Class No New Type! No New Bytecode!!

Slide 13

Slide 13 text

Value Class Identity がないクラス A value object is an object that does not have identity. JEP 401: Value Classes and Objects

Slide 14

Slide 14 text

Object Identity オブジェクトの名前もしくはアドレスのようなもの == による比較に使用される Object.hashCode() / System.identityHashCode() Identity によって Mutability Monitor Lock などを可能にする

Slide 15

Slide 15 text

Value Class Identity がないクラス Immutable フィールドは暗黙的に nal == による比較はフィールドの等価性 equals() と同じ Identity による操作は不可 Monitor Lock, Weak Reference など

Slide 16

Slide 16 text

Value Class の書き方 value class Foo { ... } value record Bar( ... ) { } 継承も可能 Value Class になりうる標準クラス Number (Integer, Double...) java.time など Early Access 公開中 https://jdk.java.net/valhalla/

Slide 17

Slide 17 text

Value Class の最適化 - 平坦化 Point points[] Point[] [0].x 0.0 [0].y 0.0 [1].x 1.0 [1].y 2.0 [2].x 3.0 [2].y 2.0 [3].x 4.0 [3].y 4.0 ArrayList elementData ArrayList list Object[] [0].x 0.0 [0].y 0.0 [1].x 1.0 [1].y 2.0 [2].x 3.0 [2].y 2.0 [3].x 4.0 [3].y 4.0 record Rect(Point tl, Point br) {} Rect tl.x 0.0 tl.y 0.0 br.x 3.0 br.y 2.0

Slide 18

Slide 18 text

Java Stack calcTotal Operand Stack Local Var this scores adder s Adder sum

Slide 19

Slide 19 text

Java Stack calcTotal Operand Stack Local Var this scores adder s .sum

Slide 20

Slide 20 text

最適化の大敵 null Null-Restricted Nullable Type の導入 JEP draft: Null-Restricted and Nullable Types https://openjdk.org/jeps/8303099 JEP draft: Null-Restricted Value Class Types https://openjdk.org/jeps/8316779

Slide 21

Slide 21 text

Null-Restriced/Nullable Type String! text = ... String? text = ... Null-Restriced Nullable 配列の初期化

Slide 22

Slide 22 text

Null-Restriced/Nullable Type String! text = ... String? text = ... Null-Restriced Nullable 配列の初期化

Slide 23

Slide 23 text

Puzzle: Do Lion Meow? 選択肢 例外

Slide 24

Slide 24 text

Puzzle: Do Lion Meow? 選択肢 例外

Slide 25

Slide 25 text

Puzzle: Do Lion Meow? 選択肢 例外 nal 変数でも 初期化前の状態に アクセスできてしまう!

Slide 26

Slide 26 text

JEP 492: Flexible Constructor Bodies super() の前にフィールド初期化が可能

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Value Class のまとめ Identity がなく、 イミュータブルなクラス 宣言時に value を付加するだけ 平坦化などの最適化のために導入 サイズが小さく フィールドが適切なデフォルト値 or 初期化されている場合のみ Value Class にすべきデータ サイズが小さく、 イミュータブルなデータ ビジネスロジックで登場する値オブジェクト Record Class は、 ほとんどの場合 Value Class にすることが可能

Slide 29

Slide 29 text

Conclusion Value Class: Code like a Class, Works like an int 平坦化などの最適化 イミュータブルなデータであれば適用可能 Null-Restriced/Nullable Type の導入 インスタンス初期化ロジックが変更 いつごろ導入されるかは???

Slide 30

Slide 30 text

Reference JEP 401: Value Classes and Objects https://openjdk.org/jeps/401 JEP draft: Null-Restricted and Nullable Types https://openjdk.org/jeps/8303099 JEP draft: Null-Restricted Value Class Types https://openjdk.org/jeps/8316779 JEP 492: Flexible Constructor Bodies https://openjdk.org/jeps/492 JEP 218: Generics over Primitive Types https://openjdk.org/jeps/218 Valhalla - Where Are We? (JVMLS 2024) https://youtu.be/IF9l8fYfSnI?si=Ghx5r9SHuxQahu-9 Valhalla - Where Are We? (Devoxx BE 2024) https://youtu.be/eL1yyTwu4hc?si=TS6AkZQtRnoEjBdQ A New Model for Java Object Initialization (JVMLS 2024) https://youtu.be/ThtrTwooKDc?si=745Bno9z1UxW263Z

Slide 31

Slide 31 text

Valhalla で、 の って どうなったの? Value Class Java in the Box 櫻庭 祐一