ホームページ  >  記事  >  Java  >  Java Valhalla プロジェクトについて話しましょう

Java Valhalla プロジェクトについて話しましょう

WBOY
WBOY転載
2022-09-07 14:07:072298ブラウズ

この記事は、java に関する関連知識を提供するもので、主に Java Valhalla プロジェクトの概要とテーマの詳細な紹介を紹介しています。一緒に見ていきましょう。お役に立てば幸いです。みんなに、役に立ちました。

Java Valhalla プロジェクトについて話しましょう

推奨学習: 「java ビデオ チュートリアル

この記事では、Valhalla プロジェクトとその歴史的理由を紹介します。開発の現在の状況と、リリース後に日常の Java 開発者に何をもたらすかについて説明します。

Valhalla プロジェクトの動機と理由

Oracle の Java 言語アーキテクトである Brian Goetz 氏は、講演の中で、Valhalla プロジェクトの主な動機の 1 つは、Java 言語とランタイムを次のような環境に適応させたいという願望であると述べました。モダンなハードウェア。 Java 言語が誕生したとき (約 25 年前の執筆時点)、メモリへのアクセスと算術演算のコストはほぼ同じでした。

現在、この状況は変化しており、メモリのフェッチ操作は算術操作の 200 倍から 1000 倍のコストがかかります。言語設計の観点から見ると、これは、ポインター抽出を伴う間接的な操作が全体的なパフォーマンスに悪影響を与える可能性があることを意味します。

アプリケーション内のほとんどの Java データ構造はオブジェクトであるため、Java は ポインタ集約型言語と考えることができます (ただし、通常は直接見たり操作したりすることはありません)。このポインターベースのオブジェクト実装は、オブジェクトの識別を可能にするために使用され、オブジェクトの識別自体は、ポリモーフィズム、可変性、ロックなどの言語機能に使用されます。デフォルトでは、これらのプロパティは、実際に必要かどうかに関係なく、すべてのオブジェクトに適用されます。

ポインターにつながる識別子のチェーンと間接化につながるポインターのチェーンをたどると、間接化にはパフォーマンス上の欠点があり、論理的な結論は、間接化を必要としないデータ構造を削除することです。ここで値の型が活躍します。

値のタイプ値のタイプ

値のタイプの概念は、純粋なデータの集計を表すことです。これにより、通常のオブジェクトから機能が削除されます。したがって、私たちは純粋なデータを持っており、アイデンティティはありません。もちろん、これはオブジェクト識別を使用して実現できる機能も失うことを意味します。したがって、同等性の比較はステータスに基づいてのみ行うことができます。したがって、表現ポリモーフィズムを使用することはできません。また、不変オブジェクトや null 非許容オブジェクトを使用することもできません。

オブジェクト識別子がなくなったので、ポインターを放棄し、オブジェクトの代わりに値型の一般的なメモリ レイアウトを変更できます。クラス ポイントと対応する値型ポイントの間のメモリ レイアウトを比較してみましょう。

通常の Point クラスのコードと対応するメモリ レイアウトは次のとおりです。

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

一方、値の型 ポイント コードと対応するメモリ レイアウトは次のようになります。

value class Point {
  int x;
  int y
}

これにより、JVM は値の型を配列やオブジェクト、さらに他の値の型にフラット化できるようになります。 。

以下の図では、配列で Point クラスを使用する場合の間接的な悪影響を示しています。ここで、値型 Point[]

に対応するメモリ構造がわかります。

これにより、JVM がスタック上で値型を渡すことも可能になります。ヒープ上にそれらを割り当てる必要はありません。最終的に、これは、int

float などの Java プリミティブと同様の実行時の動作でデータ集計を取得することを意味します。

ただし、プリミティブとは異なり、値型にはメソッドとフィールドを含めることができます。インターフェイスを実装し、ジェネリック型として使用することもできます。 したがって、値の型を 2 つの異なる観点から見ることができます:

より高速なオブジェクト

ユーザー定義のプリミティブ

    さらにおまけとして、
  • ボックス化
  • を行わずに値型をジェネリック型として使用できます。これは、別の大きなプロジェクト Valhalla の機能、特化されたジェネリックスに直接つながります。
  • 特殊なジェネリックス

言語プリミティブを一般化したい場合、現在、整数表現Integerや浮動小数点表現

Float##などのボックス型を使用しています。 #。このボックス化により追加の間接層が作成されるため、そもそもパフォーマンスを向上させるためにプリミティブを使用する目的が無効になります。

したがって、既存のフレームワークやライブラリでは、

IntStreamToIntFunction などのプリミティブ型の特殊化が数多く見られます。これは、プリミティブの使用によるパフォーマンスの向上を維持するために行われます。

したがって、ジェネリックを特殊化することで、これらの「ハック」の必要性を排除することができます。代わりに、Java 言語は、オブジェクト参照、プリミティブ、値型、さらには

void など、基本的にすべてに対してジェネリック型を有効にしようと努めています。

結論

私たちは、Valhalla プロジェクトが Java 言語にもたらす変更について予備的に理解しています。主な目標の 2 つは、パフォーマンスを向上させ、漏れやすい抽象化を減らすことです。

パフォーマンスの向上は、オブジェクト グラフを平坦化し、間接化を削除することで解決されます。これにより、メモリ レイアウトがより効率的になり、割り当てとガベージ コレクションが減ります。

ジェネリック型として使用すると、プリミティブとオブジェクトの動作がより類似し、より適切な抽象化になります。

推奨学習: 「Java ビデオ チュートリアル

以上がJava Valhalla プロジェクトについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。