クラス・ローダーの基本概念
その名前が示すように、クラス・ローダーはJavaクラスをJava仮想マシンにロードするために使用されます。一般に、Java仮想マシンはJavaクラスを次のように使用します:
.javaファイルはコンパイラによってコンパイルされた後、バイトコードの.classファイルに変換されます。クラス・ローダは、.class ファイルを読み取り、Class クラスのインスタンスに変換します。このような各インスタンスはJavaクラスを表すために使用され、そのクラスのオブジェクトはnewまたはクラスのnewInstanceによって作成することができます。実際の状況はもっと複雑で、たとえばJavaバイト・コードがツールによって動的に生成されたり、ネットワーク経由でダウンロードされたりすることがあります。
JavaJavaのクラス・ローディング・プロセス
javaのクラスロードの手順は次のとおりです。
注:関連するプロセスは厳密には連続的ではありません。例えば、ロード時に検証が開始され、交互に実行される場合があります。
ローディング
ロードとは、コンパイルされた .class ファイルをメモリのメソッド領域に読み込んで、プログラムがアクセスできるようにすることです。
完全修飾名でクラスのバイナリ・バイト・ストリームを取得します。
コネクション
糺す
ロードフェーズは必ずしもすべてのロードされた.classファイルではないので、いくつかのネットワークリソースがあるかもしれないので、独自のセキュリティのためにJVMは、最初のファイル形式をチェックします。
意図する
準備段階では、静的変数のメモリ確保と変数の初期値設定に集中します;
public static int num = 1; 準備段階の値は 0 です。
public static final int num = 1; このような定数は準備段階で割り当てられます。
パース
構文解析の段階では、記号参照と直接参照の2つの概念があります。
書かれたネイティブ・コードが.classファイルにコンパイルされた後、メソッド呼び出し間の関係は、シンボリック参照であるバイトコードを通して存在します;
そして、JVMがクラスをメモリにロードした後、メソッドはオブジェクトのアドレスを通してお互いを呼び出さなければなりません;
そして、解析段階で行われるのは、.classファイル内のシンボリック参照を直接参照に変換することです。
初期化
初期化フェーズでは、クラスの静的コード・ブロックを呼び出し、静的な静的変数に初期値を代入します。
注:クラスは複数のスレッドによって同時に実行することができ、JVMはロックを追加することによって特異性を保証します;
クラスローダーと
使い方は、オブジェクトを直接newするか、reflectionのnewInstanceでクラスのインスタンスを取得して、何らかの操作を実行するというものです。
コンパイルJITの実行
JITのランタイムコンパイルは、Javaバイトコードの再コンパイル最適化、マシンコードを生成するために、CPUが直接実行されるように、コンパイルされたコードがより効率的に、通常、すべてのJavaメソッドがマシンコードにコンパイルされていない、主な必要性は、事前にマシンコードにコンパイルされた最長の時間のメソッドを見つけるために、最長のCPU時間を占有し、最も頻繁に呼び出すには、このメソッドは、ホットスポットの方法です。このランタイムオンデマンドのコンパイルはJITです!
JITは、書き込み権限と実行権限を持つメモリの一部を申請し、コンパイルされたJavaメソッドをマシンコードにコンパイルしてあらかじめメモリに書き込んでおき、メソッドを呼び出す必要があるときにこのメモリを呼び出すようにすることで実装されます。