クラス・ロード・プロシージャの概要

982 ワード

ロードフェーズ
クラスのフルネームで定義されたバイナリバイトストリームを取得
このバイトストリームが表す静的ストレージ構造をメソッドの実行時データ構造に変換する
このクラスを表すjavaをメモリに生成する.lang.Classオブジェクトは、メソッド領域というクラスの各種データのアクセスポートとして
リンクフェーズ
検証#ケンショウ#
目的はclassファイルのバイトストリームに含まれる情報が現在の仮想マシンの要求に合致することを確保し、ロードされたクラスの正確性を保証し、仮想マシン自身の安全を危害しないことである.
主に4種類の検証を含む:ファイルフォーマット検証、メタデータ検証、バイトコード検証、シンボル参照検証
の準備を
変数にメモリを割り当て、クラス変数のデフォルト値(ゼロ値)を設定すると、メソッド領域にクラス変数が割り当てられます.
ここにはfinalで修飾されたstaticは含まれていません.finalはコンパイル時にすでに割り当てられているので、準備フェーズに初期化が表示されます.
ここではインスタンス変数の割り当ては初期化されず、インスタンス変数はオブジェクトとともにjavaスタックに割り当てられます.
解析
定数プールのシンボル参照を直接参照に変換するプロセス
実際,解析操作はJVMが初期化を実行した後に実行されることが多い.
初期化フェーズ
初期化フェーズはクラスコンストラクタメソッド()を実行するプロセスです.
このメソッドは定義する必要はありません.javacコンパイラがクラス内のすべての を自動的に収集して統合したものです.
()クラスとは異なるコンストラクタ.(コンストラクタは仮想マシンの視点で()
このクラスに親がある場合、JVMは雷の()が実行される前に、親の()が実行されたことを保証します.
仮想マシンは、クラス()メソッドがマルチスレッドで同期ロックされることを保証する必要があります.
参考資料:「java仮想マシンの第3版を深く理解する」周志明