Java仮想マシンのクラスロードメカニズム


私たちは通常1つを書きます.JAvaファイルは、コンパイラによって生成されます.classファイルを実行し、JVMで実行します.この中にはJVMがどのようにクラスをロードしますか?1つのクラスは上から下までどのように解析を開始しますか?
Java仮想マシンとプログラムのライフサイクル、つまりJVMがどのような状況でライフサイクルを終了するか:1.Systenを呼び出します.exit()このコード2.プログラム正常実行終了3.プログラムの実行中に異常やエラーが発生して異常終了し、普段私たちが言っているcarsh 4.OSにエラーが発生し、JVMプロセスが終了しました
クラスのロード、接続、初期化
クラスのロード
クラスのロードとは、クラスのバイナリデータをメモリに検索してロードすることです(.classファイル)
JVM仕様により、ローダは、あるクラスが使用することが予想される場合に、事前にロードすることができる.classファイルが不足しているか、エラーが発生している場合、クラスローダはプログラムが初めてクラスをアクティブに使用したときにエラーを報告します(LinkageErrorエラー).
このクラスがアクティブに使用されていない場合、クラスローダはエラーを報告しません.
Javaプログラムのクラスに対する使用は2種類に分けられる:アクティブ使用とパッシブ使用アクティブ使用(6種類)1.クラスのインスタンスを作成する(newオブジェクト)2.あるクラスやインタフェースにアクセスする静的変数、またはそのクラスの静的変数に値を付与する3.クラスを呼び出す静的メソッド4.1つのクラスのサブクラスを初期化する5.反射6.Java仮想マシンの起動時に起動クラスと明記されたクラス
アクティブでないものはすべて受動的に使用されます.
クラスのロードとは、クラスをロードすることを指す.classファイルのバイナリデータをメモリに読み出し、実行時のデータ領域のメソッド領域に配置し、スタック領域にjavaを作成します.lang.Classオブジェクトは、メソッド領域内のクラスのデータ構造をカプセル化するために使用されます.
クラスの接続
1.クラスの検証
クラスがロードされると、接続フェーズに入ります.接続は、メモリに読み込まれたクラスのバイナリデータを仮想マシンのランタイム環境に統合します.
クラスの検証の内容:1.クラスファイルの構造チェック2.意味検査3.バイトコード検証(悪意のある.class、ウイルス侵入を恐れる)4.バイナリ互換性の検証
2.クラスの準備
準備フェーズでは、Java仮想マシンがクラスの静的変数にメモリを割り当て、デフォルトの初期値を設定します.たとえば、次のSimpleクラスです.クラスの準備段階では、intタイプの静的変数aで4バイトのメモリ空間が割り当てられ、デフォルト値0が与えられ、longタイプの静的変数bに8バイトのメモリ空間が割り当てられ、デフォルト値0が与えられる.
public class Simple {
    private int a = 1;
    private static long b;
    static {
        b = 2;
    }
    ...
}

3.クラスの解析
解析フェーズでは、Java仮想機会はクラスのバイナリデータのシンボル参照を直接参照に置き換えます.つまり、シンボルリファレンスをポインタに置き換え、ポインタをxxxのメモリ位置に変更します.このポインタは直接リファレンスです.
クラスの初期化
初期化フェーズでは、Ja仮想マシンが初期化文を実行し、クラスの静的変数に初期値を与えます.プログラムでは,静的変数の初期化経路は,(1)静的変数の宣言で初期化する(2)静的コードブロックで初期化する
静的変数の宣言文と静的コードブロックはクラスの初期化文と見なされ、Java仮想機会は初期化文のクラスファイルの前後順に順次実行されます.
クラスの初期化手順:1.このクラスがまだロード接続されていない場合は、まずロードと接続を行う.クラスに直接の親が存在し、その親がまだ初期化されていない場合は、まず直接の親3を初期化する.クラスに初期化文がある場合は、これらの初期化文を順次実行します.
パッシブな使用ではクラスの初期化は起こりません.すべてのJava仮想マシンの実装は、Javaプログラムによって最初にアクティブに使用されるか、またはインタフェースごとに初期化される必要があります.ClassLoaderクラスを呼び出すloadClass()メソッドはクラスをロードします.クラスをアクティブに使用するわけではありません.クラスの初期化は起こりません.
プログラム内のサブクラスのアクティブな使用により、親クラスが初期化されます.ただし、親クラスのアクティブな使用では、子クラスは初期化されません.
クラスの初期化タイミング:Java仮想マシンがクラスを初期化する場合、親クラスが初期化されていることが要求されますが、このルールはインタフェースには適用されません.クラスを初期化すると、実装されるインタフェースは初期化されません.インタフェースを初期化すると、親インタフェースは初期化されません.したがって、親インタフェースは、サブインタフェースまたは実装クラスの初期化によって初期化されることはありません.プログラムが特定のインタフェースの静的変数を初めて使用する場合にのみ、インタフェースの初期化が変更されます.
プログラムがアクセスする静的変数または静的メソッドが現在のクラスまたは現在のインタフェースで確かに定義されている場合にのみ、クラスまたはインタフェースのアクティブな使用が考えられます.
クラスローダ
1.Java仮想マシンに付属するクラスローダルートクラスローダ(BootStrap):C++を使用して作成され、プログラマはJavaコードからクラスを取得できません.親ローダがなく、ClassLoaderクラスも継承されていません.拡張クラスローダ(Extension):Javaコードが実装され、そのクラスを得ることができます.親ローダはルートクラスローダです.システムクラスローダ(System):Javaコード実装で、このクラスを得ることができます.ローダは拡張クラスローダです.
2.ユーザがカスタマイズするクラスローダはjavaを継承する.lang.ClassLoaderクラス.
それらの間には継承関係はありません.
ClassクラスgetClassLoader()メソッド:ルート・クラス・ローダの場合、null loadClass()メソッドが返されます.指定したクラスをロードします.
クラス・ローダの親委任メカニズム?カスタムクラスローダ?ランタイムパッケージ?