概要
- OracleエンジニアLois Foltanが JEP 401: Value Classes and Objects のOpenJDK統合を発表
- JDK 28で プレビュー機能 として導入、デフォルトでは無効
- Valhallaプロジェクト の長年の課題解決への第一歩
- Javaのパフォーマンスと設計モデルの 根本的な進化
- 本稿はValhallaの歴史と技術的背景を 体系的に解説
JEP 401: Value ClassesとValhallaプロジェクトの全貌
- 2024年6月15日、OracleのLois Foltanが JEP 401: Value Classes and Objects のOpenJDK本体リポジトリへの統合を正式に確認
- JDK 28をターゲットとし、 197,000行以上のコード と1,816ファイルが追加される大規模変更
- 現段階では プレビュー版 であり、デフォルトで無効化
- Brian Goetzによると「これはValhallaの第一段階のみ」であり、今後さらなる進化が予定
- 長年「実装されない」と言われてきたが、ついに大きな一歩を踏み出す
Valhallaプロジェクトの目的とJavaの根本的課題
- Valhallaのスローガンは「 クラスのように書けて、intのように動く」
- Javaでは 参照型 と プリミティブ型 が分断されており、柔軟性とパフォーマンスの両立が困難
- 例:
Point p = new Point(1, 2)の場合、pは実体ではなく ヒープ上のアドレス を指す - 大量のオブジェクトを扱うと メモリレイアウトが「ふわふわ」 (fluffy)になり、キャッシュ効率が低下
- Project Lilliput はオブジェクトヘッダーの縮小に取り組むが、根本解決には至らず
メモリ密度とパフォーマンス
- 近年、CPUとメモリアクセス速度の差が拡大し、 キャッシュミス によるパフォーマンス低下が深刻化
- データが密に並ぶことで キャッシュライン ごとの効率的な読み込みが可能
- 参照型オブジェクトの配列では、 ポインタ追跡によるキャッシュミス が頻発
Escape Analysisとその限界
- JVMの エスケープ解析 により、一部のオブジェクトはヒープ割り当てを回避可能
- しかし、解析が 脆弱かつ予測不能 で、コード変更やJDKアップデートでパフォーマンスが大きく変動
- 経験豊富なJVM開発者は、エスケープ解析を 「ボーナス」扱い とし、基盤にはしない
手動によるプリミティブ最適化の問題
- 高速化のため、 Colorクラスをbyte配列で手動管理 する手法が一般的
- しかし、 安全性や可読性を犠牲 にするため、バグや意図しないデータ破壊のリスクが増大
Valhallaの歴史と設計思想の変遷
- 2014年に公式始動、 James Gosling が「6つのPhDが絡み合ったプロジェクト」と評す
- Java誕生時から 値型導入 の構想はあったが、技術的困難で断念
- 5つの異なるプロトタイプ を経て現在の設計に到達
Q WorldとL Worldの違い
- 初期案「 Q World」では値型をプリミティブと完全に分離し、型システムが複雑化
- 2019年頃、「 L World」で値型と参照型を同じキャリア(L記述子)で扱う統一モデルに成功
- 言語モデルとJVMモデルの分離 がプロジェクトの鍵となる
モデルと用語の変遷
- Stage 1: value types (曖昧な初期案)
- Stage 2: inline classes (identity有無で区別、final制約追加)
- Stage 3: primitive classesと二重投影モデル (Point.val/Point.refなど、複雑さが増し断念)
- Stage 4: value classesとvalue objects (JEP 401で確定、identity無しの参照型として定義)
現在のJEP 401と今後の展望
- value修飾子 による新しいクラス宣言方式
- インスタンスは identityを持たないvalue object
- 非null制約 は別JEP(Null-Restricted Value Class Types)で今後対応予定
- 古い記事や資料で「primitive classes」等の記述があれば 現行仕様と異なる 点に注意
- JEP 401は JEP 402(Enhanced Primitive Boxing) や各種早期アクセスビルドと連携
- 12年間は「 アイデアの淘汰」の歴史であり、保守可能な仕様に絞り込まれた
まとめ
- JEP 401は、 Javaの設計とパフォーマンスの根本的転換点
- Valhallaプロジェクトは「 便利なクラスと高速なプリミティブの両立」という長年の課題に挑戦
- JDK 28でのプレビュー導入は、今後の Java言語進化の基盤 となる可能性