まとめ
JDK 28 の Project Valhalla で Java の性能はどこまで改善するのか。 この記事では JEP 401: Value Classes and Objects と JEP 402: Enhanced Primitive Boxing を中心に、期待できる点と早すぎる期待を分けて整理します。
Valhalla は Java を突然 Go や Rust にするものではありません。より現実的には、Money、Point、ID、範囲、タイムスタンプ、メトリクス点のような小さな値オブジェクトで、割り当て、参照、メモリレイアウト、GC のコストを減らす可能性を持つ取り組みです。
目次
この記事の内容
Project Valhalla を一文で理解する
Project Valhalla は、Java のオブジェクト指向の抽象化と、プリミティブに近い性能特性を近づける試みです。
重要なのは新しい構文そのものではなく、意味のあるドメイン型を保ちながら、通常のアイデンティティオブジェクトのコストを減らす方向性です。
JEP 401: Value Classes and Objects
JEP 401 は、Java プラットフォームにアイデンティティのないオブジェクトを導入するプレビュー機能です。
new Point(1, 2) == new Point(1, 2) // 通常のオブジェクトでは多くの場合 false
value object では、焦点はオブジェクトの個体性ではなく値そのものです。
value record Point(int x, int y) {}
Point p = new Point(17, 3);
Objects.hasIdentity(p); // false
new Point(17, 3) == p; // true
value class が性能に持つ意味
- 割り当て圧力を下げられる可能性: JVM が各値を独立したヒープオブジェクトとして扱わなくてよい余地が出ます。
- メモリレイアウトをコンパクトにできる可能性: 配列やフィールドが参照だけでなく、値に近い形で配置される可能性があります。
- ドメインモデリングのコストを下げられる可能性:
Money、Point、Range、OrderIdなどで意味を保ちながらコストを抑えられるかもしれません。
ただし、すべてのプログラムが自動的に速くなるわけではありません。実装、JIT、データサイズ、GC 条件に依存するため、JMH などで実測する必要があります。
JEP 402: Enhanced Primitive Boxing
JEP 402 は、プリミティブ型とラッパークラスの分断を扱います。
int vs Integer
long vs Long
double vs Double
プリミティブは効率的ですが、現行の汎用 API では扱いづらい場面があります。ラッパーはジェネリクスに入りますが、オブジェクトとしてのコストがあります。JEP 402 は、この差を段階的に扱う Valhalla 全体の一部です。
ジェネリクス性能はすぐ改善するか
ここは期待を管理すべきです。多くの Java 開発者は List<int> が int[] のように効率的になることを期待しますが、JEP 402 は現行ジェネリクスが消去ベースである点も前提にしています。
合理的に期待できること:
- primitive と wrapper の差を一部減らす
- value class 関連最適化の土台を作る
- 将来の specialized generics 方向への準備になる
まだ期待しすぎないこと:
- List<int> がすぐ int[] と同等になる
- すべてのジェネリックコードが自動で速くなる
JDK 28 で期待できること
現実的には、JEP 401 が JDK 28 のターゲットとして議論され、開発者が試してフィードバックできる段階と見るのが安全です。
- value class の構文と動作を試す
- アイデンティティのないオブジェクトモデルを理解する
- 将来の候補になる小さな値型をコードから探す
- 実コードに近いベンチマークで効果を測る
一方で、本番サービスをすぐ全面的に書き換える、全 DTO を value class に置き換える、といった判断は早すぎます。
今から準備できること
コードを変える前に、「意味のある値型なのに性能のため primitive に崩している場所」を探すとよいです。
Money
Point
Range
UserId
OrderId
EventTime
MetricPoint
ベンチマークでは、スループットだけでなく割り当てレート、メモリフットプリント、GC の動きを一緒に見ます。
誤解しやすい点
value class は record と同じですか? いいえ。record は構文簡略化、value class はアイデンティティのない値を表す方向です。
JDK 28 なら本番で大規模利用できますか? プレビュー機能である限り慎重に扱うべきです。
Java が Go や Rust と同じになりますか? いいえ。Valhalla は Java の内部モデルを改善する取り組みであり、別言語の特性をそのまま得るものではありません。
結論
JDK 28 Project Valhalla が重要なのは、意味のあるオブジェクトモデリングとプリミティブ効率の距離に触れているからです。長く Java を使ってきた立場では、この方向性にはかなり期待しています。
ただし、期待は実測で確認すべきです。プレビュー段階では学習、検証、候補型の整理に留め、仕様と JVM 実装が安定してから判断するのが現実的です。
関連記事
参考文献
- OpenJDK Project Valhalla
- JEP 401: Value Classes and Objects (Preview)
- JEP 402: Enhanced Primitive Boxing (Preview)
- JVM Weekly: Project Valhalla explained