Javaクラスのロードプロセスに関する興味深いディスカッション

まず、クラスローディングのライフサイクル図をぶら下げましょう

画像ソース:インタビュアー:Javaの静的メソッドが非静的メソッドと変数を呼び出せないのはなぜですか?
クラス読み込みプロセスの画像

特定のプロセスの説明:

  • 1. 読み込み:「読み込み」は「クラスプラスメカニズム」の最初のプロセスです。読み込みフェーズでは、仮想マシンは主に次の3つを完了します。
    • 完全修飾名によってクラスによって定義されたバイナリバイトストリームを取得します。
    • このバイトストリームで表される静的ストレージ構造をメソッド領域のランタイムデータ構造に変換します
    • このクラスを表すClassオブジェクトは、メソッド領域のこれらのデータへのアクセスエントリとしてヒープに生成されます。

この時点では、コードに静的変数または静的メソッドがあるかどうかをスキャンして、これらの静的データ構造が割り当てられていないことに注意してください。

  • 2. 検証検証の主な機能は、ロードされたクラスが正しいことを確認することです。

  • 3. 準備:準備フェーズでは、主にクラス変数にメモリを割り当て、初期値を設定します。これらのメモリはメソッド領域に割り当てられます。メモリはクラス変数、つまり静的変数に割り当てられますが、通常のメンバー変数はまだ割り当てられていないことに注意してください。

  • 4. 解析:解析段階は主に、仮想マシンが定数プール内のシンボル参照を直接参照に変換するプロセスです。

  • 5. 初期化:これはクラス読み込みメカニズムの最後のステップであり、この段階でJavaプログラムコードの実行が開始されます。クラス変数には、準備フェーズで値が割り当てられています。初期化段階で、プログラマーはニーズに応じて値を割り当てることができます。初期化中に通常のメンバー変数に値を割り当てます。

次に、楽しみ始めます

  • 1. 読み込み:TeslaクラスはShanghai JVMで実行する必要があるので、最初のステップはそれを彼に与えることです、そうです、3つのことを行う必要があります:
    • 上海では、定義されたバイナリバイトストリーム(テスラの建設計画図)を取得するために、クラスの完全修飾名(テスラ、米国...)を使用する必要があります。
    • このバイトストリームで表される静的ストレージ構造(図面上の構造)をメソッド領域のランタイムデータ構造(上海の特定の領域の実際の土地構造)に変換します。
    • 上海はテスラの工場設立に対処するために特別なプロジェクトチームを設立しました。このプロジェクトチームは、すべてのテスラの状況を記録し(このプロジェクトチームはテスラのクラスオブジェクトを表します)、プロジェクトチームは常に存在し(テスラと共に姿を消した)、他の人々がテスラを訪れました実際のテスラ工場に直接行く代わりに。
  • 2. 検証検証の主な機能は、このテスラがテスラであり、土地を取得するためにお金を偽造した開発者ではないことを確認することです(コードインジェクションによるセキュリティの脆弱性を防ぐため)。
  • 3. 準備:テスラ工場の土地の分割を開始し、テスラストア(例)のように、図面のA領域とB領域が落ちる上海の実際の土地(静的メモリ割り当て)を調査します。 (オブジェクト)心配しないでください。これらの店先は上海のダウンタウンの人々の流れのサイズに基づいて選択されるため、店先に配置されたサンプル車(通常のメンバー変数)について言及する必要はありません。
  • 4. 分析:シンボリックリファレンスが実際のリファレンスに変換されます。これは少し複雑です。次のように説明してください:シンボリックリファレンスはテスラの工場図面上のシンボルですが、レンガを動かした人はそれを知らないため、デザイナーに尋ねました。詳細についてエグゼクティブデザイナーに尋ねます。エグゼクティブデザイナーは、これはXXのアウトソーシング会社から提供されたと言いました。あなたはXXの会社に尋ねました。最後に、XXの会社に尋ねました。この記号は特別なコードトイレ(実際の参照)なので、すべてのシンボリック参照を実際の参照に変換するには、多くの労力を要しました。
    • ここに2つのポイントがあります:
      • 直接参照がある場合は、直接参照のターゲットをメモリにロードする必要があります(この記号が実際に何を意味するのかを尋ねている必要があることを示します)。
      • シンボリック参照を直接使用するのがよくないのはなぜですか?コンパイル時、各Javaクラスはクラスファイルにコンパイルされますが、仮想マシンはコンパイル時に参照クラスのアドレスを認識しないため、代わりにシンボリック参照を使用します。この解析フェーズでは、このステージはシンボル参照に変換された実際のアドレス(エグゼキュータがtrueのときに実行を計画している人々をコンパイルします。彼らは、実行の実際の状況考慮できないようにコンパイルされた2つのグループです。これがコンパイルされる理由です。エラーと実行時エラー)。
  • 5. 初期化:これは、Teslaが製品化される前の最後のステップであり、この段階でJavaプログラムコードの実行が開始されます。準備段階で、クラス変数に値が割り当てられていることがわかります(計画されたエリアへの実際の土地の割り当て)。初期化の段階で、プログラマーはニーズに応じて値を割り当てることができます(つまり、次の2つの点を意味します)。
    • 1.以前割り当てられていた値を変更します。
    • 2.以前は割り当てがありませんでしたが、今割り当てます。
      以前に割り当てがない場合、現在割り当てられていない場合、コンパイル期間が経過しないことに注意してください。
      同時に、ストアもこの時点で初期化され、通常のメンバー(Teslaプロトタイプ)の変数が初期化中に割り当てられます。

レンガ作りへようこそ、それを修正します!
私のgithubプロジェクト、AlgorithmPracticeも宣伝します。
このプロジェクトは、簡単に検索できる知識構造システムを確立することを目的としています。より志を同じくする友人がAlgorithmPractice参加することを歓迎しています(問題やプルリクエストは歓迎です)

おすすめ

転載: blog.csdn.net/ljfirst/article/details/105363449