簡単
Javaのクラス・ファイルができたら、ロード、リンク、初期化のプロセスを経て、クラス・ファイルをJVMが実際に実行できる構造に変換する必要があります。
この3つのプロセスはどのように機能するのでしょうか?この記事でその答えが見つかります。
に
JVMは、3つの主要な部分、5つのスペースと3つのエンジンに分けることができ、話すことは特に複雑ではありませんが、まず、次の全体的なJVMアーキテクチャ図を見てください。
上の図から、JVMにはクラス・ローディング・システム、ランタイム・データ・エリア、実行エンジンの3つの主要な部分があることがわかります。
ロードとは、特定の名前に基づいてクラスやインターフェイスのバイナリ表現を見つけ、このバイナリ表現に基づいてクラスやインターフェイスを作成するプロセスです。
実行時定数プール
JVMにメソッド領域があることを知っているJDK8では、メソッド領域の実装はメタ空間と呼ばれています。このメタ空間はローカルメモリに格納されます。
メソッド領域は、各クラスに対応する実行時定数のプールを保持します。
クラスまたはインターフェイスが作成されると、クラス・ファイルで定義された定数プールから実行時定数プールが構築されます。
実行時定数プールには、シンボリック参照と静的定数の2種類があります。
ここで、静的定数はその後の解析処理を必要とせず、記号参照はさらなる解析処理を必要とします。
静的定数は、文字列定数と数値定数の2つに分けられます。
シンボリック参照もクラス内の constant_pool から構築されます。
クラスとインターフェースへのシンボリック参照は CONSTANT_Class_info から取得します。
クラスとインターフェイスのフィールドへの参照は CONSTANT_Fieldref_info から得られます。
クラス内のメソッドへの参照は CONSTANT_Methodref_info から取得します。
メソッドハンドルへの参照はCONSTANT_MethodHandle_infoから来ています。
メソッド・タイプへの参照は CONSTANT_MethodType_info から取得します。
動的計算定数へのシンボリック参照は CONSTANT_MethodType_info から取得します。
動的に計算される呼び出しサイトへの参照は、CONSTANT_InvokeDynamic_infoから取得されます。
クラスローダ
クラスはどのように作成されるのですか?クラスは、他のクラスがクラスの初期化メソッドを呼び出すか、リフレクションによって作成されます。
クラスは、実際には配列クラスと非配列クラスの2つのタイプに細分化することができます。
非配列クラスについては、対応するバイナリ表現があるため、クラス・ローダーを通してバイナリ表現をロードすることで作成されます。
配列クラスに関しては、外部バイナリ表現を持たないため、配列クラスはJava仮想マシンによって作成されます。
Java仮想マシンのクラス・ローダーには、仮想マシンが提供するブートストラップ・クラス・ローダーと、ユーザー定義のクラス・ローダーの2種類があります。
ユーザー定義クラス・ローダーであれば、ClassLoader の実装である必要があります。ユーザー定義クラス・ローダーは、主にクラスの動的なロードと作成をサポートするために、Java 仮想マシンの機能を拡張するように設計されています。
リンク
リンクとは、クラスやインターフェイスをJava仮想マシンで実行可能にするために、仮想マシンの実行時状態にマージするプロセスのことです。
リンク固有のタスクには、クラスまたはインタフェースの検証と準備が含まれます。このクラスまたはインタフェースのシンボリック参照を解決することは、リンク・プロセスのオプションの一部です。
java仮想マシンが、クラスやインターフェイスのシンボリック参照を、それらが使用されるときだけ解決することを選択した場合、これは遅延解決と呼ばれます。
クラスの検証時にJava VMがシンボリック参照を解決する場合、これは事前解決と呼ばれます。
糺す
検証は主に、クラスとインターフェースのバイナリ表現の構造的な正しさを保証するためのものです。
クラスまたはインタフェースのバイナリ表現が適切な制約を満たさない場合、VerifyError 例外がスローされます。
意図する
準備とは主に、クラスやインターフェイスの静的フィールドを作成し、デフォルト値で初期化することです。
パース
構文解析とは、実行時の定数プール内のシンボリック参照に基づいて、定数の特定の値を動的に決定するプロセスです。
Java仮想マシン命令の実行:
構文解析は、クラスとインターフェイスの構文解析、フィールドの構文解析、通常のメソッドの構文解析、インターフェイスメソッドの構文解析、メソッドタイプとメソッドハンドルの構文解析、コールポイント修飾子の構文解析に分けられます。
初期化
クラスやインターフェースの初期化とは、そのクラスやインターフェースの初期化メソッドを実行することです。
クラスやインターフェイスが初期化されるのは、次のような場合だけです:
- クラスまたはインターフェイスへの参照を必要とするJava仮想マシン命令を実行する場合。
- java.lang.invoke.Methodhandleインスタンスへの最初の呼び出し。
- クラス・ライブラリの特定のリフレクション・メソッドを呼び出すとき。
- クラスのサブクラスを初期化するとき。
- はjava仮想マシンの起動時に初期クラスとして選択されます。
概要
クラス・ファイルがロードされ、リンクされ、初期化されると、実行時に使用するためにJVMに提供する準備が整います。
この記事を書いた人: Flydean procedure those things
この記事へのリンクwww.flydean.com/jvm-class-l
出典:フライディーンブログ




