Javaクラスのロードメカニズムとロードプロセスは何ですか?
Java 仮想マシン(JVM)が実行時に Java クラスをロードして初期化するプロセスを Java クラスローダーメカニズムという。
Javaクラスの読み込み処理は主に3段階に分かれています。
- ロード(Loading):ロード段階では、JVMはクラスの完全修飾名(クラスのパッケージ名とクラス名を組み合わせたもの)によってクラスのバイトコードファイルを検索してロードします。具体的には、JVMはクラスローダーの階層構造に基づき、まずブートストラップクラスローダー(Bootstrap ClassLoader)を使用してクラスのロードを試みます。見つからない場合は、拡張クラスローダー(Extension ClassLoader)がクラスをロードし、最後にアプリケーションクラスローダー(Application ClassLoader)がクラスをロードします。上記のクラスローダーのいずれもクラスを見つけられない場合は、ClassNotFoundException例外がスローされます。
- リンク時: JVM は、バイトコードの検証、準備、解析などを行います。
- 検証フェーズでは、クラスのバイトコードがJava仮想マシン仕様に準拠しており、仮想マシンの安全性を損なうものではないことを確認します。
- 準備(Preparation): 準備段階では主に、クラスの静的変数のメモリを確保し、デフォルトの初期値を設定します。
- 解決(Resolution):解決フェーズは主に、クラス、インタフェース、フィールド、メソッドのシンボル参照を直接参照に解決することです。
- イニシャライズ(初期化):イニシャライズの段階では、JVMが静的変数のクラスの割り当てと静的コードブロックのコードと、クラス内に定義された静的メソッドを実行します。この段階において、JVMは複数のスレッド環境での安全性を保証します。つまり、1つのスレッドだけがクラスを初期化することができ、他のスレッドは待機する必要があります。
クラスのロードは実行時に行われる動的な処理であり、コンパイル時に静的に行われるものではないことに注意してください。つまり、Javaコードで参照されるクラスはコンパイル時にはまだ存在せず、実行時になって初めてロードされ初期化されます。