Java Project Valhallaがついに始動 — 値クラス(JEP 401)がJDK 28で何を変えるのか

はじめに

2014年に始動した Java の野心的な内部刷新プロジェクト「Project Valhalla」が、ついに具体的な形になります。中核となる JEP 401(Value Classes and Objects) が、2026年7月ごろに OpenJDK のメインラインへ統合され、JDK 28 のプレビュー機能として登場することが明らかになりました。実に 197,000行・1,816ファイルに及ぶ巨大な変更です。本記事では、この「値クラス」が一体何を解決し、Java のメモリレイアウトとパフォーマンスをどう変えるのかを、技術的な仕組みから丁寧に解説します。

値クラスとは何か — 「intのように動くクラス」

Java は1995年の設計当初から「すべてのオブジェクトは識別子(identity)を持つ」という前提に立っています。int や double などごく一部のプリミティブ型を除き、あらゆる型は参照型であり、ヒープ上に確保され、ポインタ経由でアクセスされます。これが Java のメモリ効率とキャッシュ局所性の足かせになってきました。

Project Valhalla が掲げるスローガンは “codes like a class, works like an int”(クラスのように書け、intのように動く)。JEP 401 で導入される 値クラス(value class) は、この理想を実現する仕組みです。

value class Point {
    final int x;
    final int y;
}

value 修飾子を付けたクラスは識別子を持たないオブジェクトになります。フィールドは暗黙的に final となり、synchronized ブロックでのロックや == による参照同一性比較ができなくなる代わりに、JVM はこのオブジェクトを自由なレイアウトで配置できるようになります。

なぜ速くなるのか — スカラー化とヒープのフラット化

値クラスがパフォーマンスを引き上げる鍵は、JVM が得る2つの最適化の自由にあります。

スカラー化(Scalarization): JIT コンパイラが値オブジェクトの参照を構成フィールドへと分解します。ポインタとして渡すのではなく、x と y を直接レジスタやスタックで受け渡しできるため、アロケーション(ヒープ確保)そのものが消えます。

ヒープのフラット化(Heap Flattening): 値オブジェクトを、ポインタ間接参照なしにコンパクトなビット列としてフィールドや配列へ直接埋め込みます。たとえば 100万要素の Point[] 配列は、従来「ヘッダ付きの散在した100万個のポインタ」だったものが、連続した8バイト単位のエンコーディングへと変わります。結果としてキャッシュ局所性が劇的に向上し、シーケンシャルアクセスが高速化します。

データ集約処理、ベクトル演算、金融システム、ゲームエンジンなど、大量の小さな値を扱う領域ほど恩恵が大きくなります。「抽象化(メソッドやバリデーション)の自由を、プリミティブ並みのメモリ効率を犠牲にせず手に入れる」というのが本質です。

エンジニアへの影響 — 何が使えて、何がまだなのか

JDK 28 時点での重要な制約を押さえておく必要があります。

  • プレビュー機能: デフォルトでは無効。明示的にオプトインして試す段階で、本番投入はまだ先です。
  • null は許容される: JDK 28 の値クラスは依然として参照型で、null を取れます。non-nullable な「null制限型(Null-Restricted Types)」は別の将来 JEP で導入予定です。
  • ジェネリクスは未対応: 型消去のため ArrayList<Point> は今もヒープ上に materialize されます。フラットなジェネリックコレクションは将来の「Specialized Generics」フェーズ待ちです。
  • フラット化サイズの上限: アトミックにフラット化できるのは現状おおむね 64ビット程度まで。これより大きいクラスは原子的にフラット化されない場合があります。

移行面では朗報もあります。Integer / Long / Double などのラッパークラスがプレビューの下で値クラスへ移行され、既存コードの多くはそのまま動作します。破壊的変更は、識別子に依存するコード(synchronized や == 比較)に限られます。

まとめ

  • Project Valhalla の中核 JEP 401 が JDK 28 でプレビュー入り。10年越し・197,000行の巨大変更。
  • 値クラスは識別子を捨てる代わりに、スカラー化とヒープのフラット化で「intのように動く」高速性を獲得する。
  • 配列やデータ集約処理でキャッシュ局所性が大きく改善する一方、null制限型・ジェネリクス対応・大きいクラスのフラット化は将来フェーズ送り。
  • 正式リリースは JDK 28(2027年3月予定) だが、まずはプレビューで挙動を確かめる段階。Java のパフォーマンスモデルが根本から変わる転換点として、今のうちに概念を押さえておく価値は十分にあります。

ソース


今日のその他のニュース

Supabase が大型アップデート+$500M調達 Supabase が Passkey サインイン(Face ID / Touch ID / Windows Hello)、ChatGPT アプリ連携(SQL実行・スキーマ変更など29ツール)、MCP サーバ同梱の AI Coding Agents プラグイン(Claude Code / Cursor / Codex / Gemini CLI 対応)を発表。あわせて $10B プレマネー評価の Series F で $500M を調達しました。

Zero-Touch OAuth for MCP(HN 246pt) Model Context Protocol(MCP)にエンタープライズ向けの管理認証が登場。AIエージェント連携基盤における認証の標準化が一歩前進し、企業導入のハードルが下がります。

MIT、チップ理解のため独自OSを構築(HN 316pt) チップが実際にどう動くかを研究するため、MIT の研究者が独自のオペレーティングシステムをゼロから構築。ハードウェアとソフトウェアの境界を学ぶ題材として注目を集めています。