blog

JVMの詳細:クラスのロード、リンク、初期化

Javaのクラスファイルを持った後、クラスファイルをJVMが実際に実行できる構造に変換するためには、ロード、リンク、初期化のプロセスを経る必要があります。 この3つのプロセスはどのように行われるのでし...

Jul 19, 2020 · 4 min. read
シェア

簡単

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仮想マシン命令の実行:

構文解析は、クラスとインターフェイスの構文解析、フィールドの構文解析、通常のメソッドの構文解析、インターフェイスメソッドの構文解析、メソッドタイプとメソッドハンドルの構文解析、コールポイント修飾子の構文解析に分けられます。

初期化

クラスやインターフェースの初期化とは、そのクラスやインターフェースの初期化メソッドを実行することです。

クラスやインターフェイスが初期化されるのは、次のような場合だけです:

  1. クラスまたはインターフェイスへの参照を必要とするJava仮想マシン命令を実行する場合。
  2. java.lang.invoke.Methodhandleインスタンスへの最初の呼び出し。
  3. クラス・ライブラリの特定のリフレクション・メソッドを呼び出すとき。
  4. クラスのサブクラスを初期化するとき。
  5. はjava仮想マシンの起動時に初期クラスとして選択されます。

概要

クラス・ファイルがロードされ、リンクされ、初期化されると、実行時に使用するためにJVMに提供する準備が整います。

この記事を書いた人: Flydean procedure those things

この記事へのリンクwww.flydean.com/jvm-class-l

出典:フライディーンブログ

Read next

アプレットカスタムコンポーネント

1. pageLoadOrder onLoad ページがロードされたときにトリガーされます。onLoadパラメータで、現在のページを開くためのパスのパラメータを取得できます。 onShow ページが最初にレンダリングされたときにトリガーされます。ページに対して一度だけ呼び出され、...

Jul 19, 2020 · 2 min read

質問02.06.

Jul 19, 2020 · 1 min read

シンセサイズ

Jul 19, 2020 · 2 min read

CKEditor

Jul 19, 2020 · 1 min read