Java(四)クラスのロードプロセスを深く理解する
2079 ワード
クラス・ロード・プロシージャ
クラスのライフサイクル
クラスのライフサイクルには、ロード-検証-準備-解析-初期化-使用-アンインストール-準備-解析を接続フェーズと呼び、他のフェーズは順次発生します.Javaはダイナミックバインド(末期バインド)をサポートし、実行時に特定のタイプを決定する必要があるため、解析はこれらのフェーズと交差して実行できます.
クラスの初期化トリガ
クラスのロードメカニズムには明確なトリガ条件はありませんが、5つの場合、クラスを初期化する必要があります.ロード–検証–準備は、その前に完了する必要があります. 1.new、getstatic、putstatic、invokestaticの4バイトコード命令時にクラスを初期化(すなわち、オブジェクトのインスタンス化、静的オブジェクトの読み書き、静的メソッドの呼び出し時にクラスを初期化)サポートする場合、MethodHandleインスタンスの解析結果がREF_である場合getstatic、REF_putstatic、REF_invokestaticのメソッドハンドル(すなわち、静的オブジェクトの読み書きまたは静的メソッドの呼び出し)では、そのハンドル対応クラスが初期化されます.
クラスのロード・プロシージャ
ユーザーの観点から言えば、クラス(オブジェクト)のライフサイクルは、「ロード-使用-アンインストール」と大まかに理解するだけです.あまり深く入り込む必要はありません.したがって、ここでのクラス・ロード・プロシージャは、使用前の5つのフェーズ1、ロード:ロード・フェーズ、仮想マシンは、クラス名からクラスのバイナリバイトストリームを取得し、バイトストリームの内容をメソッド領域に転送する3つのことを完了する必要があります.メモリにクラスメソッド領域データのアクセスエントリとしてクラスオブジェクトを生成します. ここで、最初のステップ:クラス名によるクラスのバイナリバイトストリームの取得は、クラスローダによって行われる.親委任モデルを使用したロード・プロシージャ:
親委任モデルを採用する理由:同じクラスが複数のクラスローダで繰り返しロードされないようにする. 2:classファイルのバイナリバイトストリームに含まれる情報シンボル仮想マシンの要件を確認します.ファイルフォーマットの検証、メタデータ検証(データ意味解析)、バイトコード検証(データストリーム意味正当性)、シンボル参照検証(シンボル参照の整合性検証、解析が正しく実行されることを確保)(静的変数)メソッド領域にメモリを割り当て、ゼロ値を設定します.ここではクラス変数であり、インスタンス変数ではありません.インスタンス変数は、オブジェクトがスタックメモリに割り当てられたときに実行時に基づいて動的に生成されます.ポインタポインタが戻ります. 5:初期化は、コード付与文に基づいてクラス変数およびその他のリソースを初期化して付与するJavaプログラムコードの実行を開始します.コンパイラはクラス内のすべてのクラス変数の付与文と静的文を自動的に収集し、収集の順序はプログラムコードに現れる順序である.したがって、静的文では、静的文ブロックを定義する前の変数にのみアクセスできます.その後の変数には、新規作成および付与に相当する値を付与できますが、アクセスできません(まだ表示されていないため).アップコンバートの例を分析するときのプログラムコードの実行順序:親の静的コンテンツ-子の静的コンテンツ-親の構造-子の構造-子の構造-子の方法.フェーズ後、classオブジェクトを使用するか、インスタンスオブジェクトを使用することができます.使用後、クラスのclassオブジェクトまたはインスタンスオブジェクトが不要になった場合、クラスはアンインストールされます(メソッド領域で発生するゴミ回収:不要なクラスのアンインストール).
クラスのライフサイクル
クラスのライフサイクルには、ロード-検証-準備-解析-初期化-使用-アンインストール-準備-解析を接続フェーズと呼び、他のフェーズは順次発生します.Javaはダイナミックバインド(末期バインド)をサポートし、実行時に特定のタイプを決定する必要があるため、解析はこれらのフェーズと交差して実行できます.
クラスの初期化トリガ
クラスのロードメカニズムには明確なトリガ条件はありませんが、5つの場合、クラスを初期化する必要があります.ロード–検証–準備は、その前に完了する必要があります. 1.new、getstatic、putstatic、invokestaticの4バイトコード命令時にクラスを初期化(すなわち、オブジェクトのインスタンス化、静的オブジェクトの読み書き、静的メソッドの呼び出し時にクラスを初期化)サポートする場合、MethodHandleインスタンスの解析結果がREF_である場合getstatic、REF_putstatic、REF_invokestaticのメソッドハンドル(すなわち、静的オブジェクトの読み書きまたは静的メソッドの呼び出し)では、そのハンドル対応クラスが初期化されます.
クラスのロード・プロシージャ
ユーザーの観点から言えば、クラス(オブジェクト)のライフサイクルは、「ロード-使用-アンインストール」と大まかに理解するだけです.あまり深く入り込む必要はありません.したがって、ここでのクラス・ロード・プロシージャは、使用前の5つのフェーズ1、ロード:ロード・フェーズ、仮想マシンは、クラス名からクラスのバイナリバイトストリームを取得し、バイトストリームの内容をメソッド領域に転送する3つのことを完了する必要があります.メモリにクラスメソッド領域データのアクセスエントリとしてクラスオブジェクトを生成します. ここで、最初のステップ:クラス名によるクラスのバイナリバイトストリームの取得は、クラスローダによって行われる.親委任モデルを使用したロード・プロシージャ:
: JAVA_HOME/lib 。
: JAVA_HOME/lib/ext 。
( ): Class_Path 。( , jar ClassPath )
: ( : 、 ), 。
: , , 。 , 。
親委任モデルを採用する理由:同じクラスが複数のクラスローダで繰り返しロードされないようにする. 2:classファイルのバイナリバイトストリームに含まれる情報シンボル仮想マシンの要件を確認します.ファイルフォーマットの検証、メタデータ検証(データ意味解析)、バイトコード検証(データストリーム意味正当性)、シンボル参照検証(シンボル参照の整合性検証、解析が正しく実行されることを確保)(静的変数)メソッド領域にメモリを割り当て、ゼロ値を設定します.ここではクラス変数であり、インスタンス変数ではありません.インスタンス変数は、オブジェクトがスタックメモリに割り当てられたときに実行時に基づいて動的に生成されます.ポインタポインタが戻ります. 5:初期化は、コード付与文に基づいてクラス変数およびその他のリソースを初期化して付与するJavaプログラムコードの実行を開始します.コンパイラはクラス内のすべてのクラス変数の付与文と静的文を自動的に収集し、収集の順序はプログラムコードに現れる順序である.したがって、静的文では、静的文ブロックを定義する前の変数にのみアクセスできます.その後の変数には、新規作成および付与に相当する値を付与できますが、アクセスできません(まだ表示されていないため).アップコンバートの例を分析するときのプログラムコードの実行順序:親の静的コンテンツ-子の静的コンテンツ-親の構造-子の構造-子の構造-子の方法.フェーズ後、classオブジェクトを使用するか、インスタンスオブジェクトを使用することができます.使用後、クラスのclassオブジェクトまたはインスタンスオブジェクトが不要になった場合、クラスはアンインストールされます(メソッド領域で発生するゴミ回収:不要なクラスのアンインストール).
(5 )—— —— —— ——