#jvm クラスのロードのプロセスは、ロード、接続、初期化の 3 つのステップに分かれています。
Loading
このクラスを、クラスのフルパスを介して外部から jvm にロードします。同時にメソッド領域でクラスの説明情報を生成し、クラスの Claas 型をメモリ上に生成します。メソッド領域内のこのクラスのデータ アクセス エントリとして。
接続
これは非常に重要なステップですが、プロセスはより複雑で、検証、準備、分析の 3 つのステップに分かれています。
検証: クラスのロードが正しいことを確認します。一般的にはjavacでコンパイルされたクラスファイルは問題ありませんが、人によっては他の方法でクラスファイルを独自にコンパイルしている場合があり、JVMのコンパイル規則に準拠していない可能性がありますので、この部分をフィルタリングして除外します。
準備: クラスの静的変数にメモリを割り当て、デフォルト値に初期化します。静的変数には手動で値を割り当てることができることは誰もが知っていますが、それらには当然初期値があります。たとえば、int 型の初期値は 0、boolean 型の初期値は false、そして初期値は 0 です。参照型の値が null です。ここで、静的変数にはメモリのみが割り当てられており、この時点ではオブジェクト インスタンスは存在しないことに注意してください。
分析: クラス内のシンボル参照を直接参照に変換します。シンボリック参照と直接参照について説明します。たとえば、メソッド A でメソッド B を使用する場合、A(){B();}、ここでの B() はシンボリック参照です。私たちが初めて Java を学んだとき、これが Java への参照であることは誰もが知っていて、B であると考えていました。メソッド B のメモリ アドレスを指しました。しかし、これは不完全です。ここでの B は、単なる記号参照です。メソッドの呼び出しに関して実際的な意味はあまりありません。プログラマが、このメソッドがこの Call のようになり得ることはわかっていますが、メソッド B が実際に呼び出されるとき、メソッド B はポインタを介してメソッド B のメモリ アドレスを指します。このポインタは実際にメソッド呼び出しを担当しており、直接参照です。
初期化
初期化フェーズでは、クラスの初期化メソッド clinit() が呼び出され、実際の値を静的変数に割り当てます (たとえば、assign値を 123 に設定して)、静的コード部分を実行します。 JVM 仕様にはロードのタイミングに関する必須の制約はありませんが、初期化に関して、JVM 仕様では、クラスを直ちに初期化する必要がある状況は 5 つだけであると厳密に規定されています。 clinit() メソッドが生成されます。 clinit() メソッドは、クラス内の静的変数と静的ステートメントを自動的に収集するコンパイラーによって生成されます。コンパイラが収集する順序は、ステートメントが出現する順序によって決まります。次の図に示すように、静的ステートメント ブロックは、その後に定義された変数のみをコピーできますが、それらを使用することはできません。また、仮想マシンの仕様により、clinit が親クラスの () メソッド。サブクラスの前に実行する必要がありますが、継承を通じては実行できません。
以上がJVMクラスロードのプロセスは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。