要点を述べる まず、面接の質問を紹介しましょう
なぜ?なぜ?これは、Java クラスのロードのタイミングから始まります。 当初は分析結果を一番下に書くつもりでしたが、最後まで読む忍耐力がないと心配だったので、まずはここで簡単に分析します。以下の分析が理解できない場合は、記事はそれほど長くないので、最後まで読むことを心からお勧めします。
クラスの読み込み時間 クラスは仮想マシンのメモリにロードされた時点で開始され、メモリからアンロードされた時点で終了します。ライフサイクル全体には、読み込み、検証、準備、解析、初期化、使用、アンロードの 7 つの段階が含まれます。検証、準備、解析の 3 つの部分を総称してリンクと呼びます。 ロード、検証、準備、初期化、アンロードの 5 つのステップの順序は固定されています。場合によっては、Java 言語のランタイム バインディング機能をサポートするために、初期化後に解析フェーズが発生することがあります。 クラスの初期化を開始するタイミング
インターフェースをロードするプロセスは、クラスをロードするプロセスとは少し異なります。 `static{}` ブロックはインターフェースでは使用できません。インターフェイスが初期化されるときに、その親インターフェイスのすべてが初期化を完了している必要はありません。親インターフェースが実際に使用されるとき(たとえば、インターフェースで定義された定数を参照するとき)のみ初期化されます。 受動的な引用の例 例1 静的フィールドの場合、フィールドを直接定義するクラスのみが初期化されます。親クラスのフィールドがサブクラスによって参照される場合、親クラスは初期化されますが、サブクラスは初期化されない可能性があります。サブクラスが初期化されるかどうかは、JVM 仮想マシン仕様では明確に指定されておらず、仮想マシンの特定の実装によって異なります。 上記のコードを実行すると、出力は次のようになります。
例2 上記のコードを実行すると、「SubClass init!」上記のDemo#main()メソッドでは、SubClassクラスは初期化されず、SubClass[]配列クラスが初期化されるため、出力されません。 SubClass[] 配列クラスは、Object クラスから継承され、newarray バイトコードによって作成される、要素タイプが SubClass の 1 次元配列を表します。 例3 上記のコードを実行すると、「Constant init!」これは「定数伝播最適化」という概念に関係するため、出力されません。 Demo クラスはコード内で Constant クラスの定数 VALUE を参照しますが、VALUE の実際の値は "Hello World!" です。コンパイルフェーズ中に、Demo クラスの定数プールに配置されます。 Demo クラスが「Hello World!」を使用するたびに、定数の場合は、独自の定数プール内で検索します。 Demo クラスは Constant クラスへのシンボリック参照を保持していないため、Constant クラスは初期化されません。 クラスのロードプロセス 負荷 読み込みフェーズには 3 つのステップがあります。
この段階では、次の 2 つの点に注意する必要があります。
確認する 検証は接続フェーズの最初のステップです。検証の目的は、`.class` ファイル内のバイト ストリームに含まれる情報が現在の仮想マシンの要件を満たし、仮想マシン自体のセキュリティを危険にさらさないことを確認することです。 `Java` 言語自体は比較的安全な言語です。 Java コーディングを使用する場合、配列の境界外のデータにアクセスしたり、オブジェクトを実装していない型に変換したりすることはできません。これを行うと、コンパイラはコンパイルを拒否します。ただし、`Class` ファイルは必ずしも `Java` ソース コードからコンパイルされるわけではなく、16 進エディター (`UltraEdit` など) を直接使用するなど、任意の方法で記述できます。有害な「コード」(バイト ストリーム)が直接書き込まれ、仮想マシンがクラスをロードするときにチェックしない場合は、仮想マシンまたはプログラムのセキュリティが危険にさらされる可能性があります。
検証フェーズは、仮想マシンのクラス ロード メカニズムにとって必ずしも必要なフェーズではありません。実行中のすべてのコードが安全であることが確認された場合は、`-Xverify:none` パラメータを使用してほとんどのクラス検証手段をオフにし、仮想マシン クラスの読み込み時間を短縮できます。 準備する 準備段階では、クラスの静的変数にメモリを割り当て、デフォルト値に初期化します。このメモリはすべてメソッド領域に割り当てられます。クラス内のインスタンス変数のメモリは、準備フェーズでは割り当てられません。インスタンス変数は、オブジェクトがインスタンス化されるときに、オブジェクトとともに Java ヒープ内に割り当てられます。 注意すべき点がいくつかあります: 1. メソッド領域にメモリが割り当てられるのは、インスタンス変数ではなく、クラス変数(`static` によって変更される変数)のみです。インスタンス変数には、オブジェクトとともに Java ヒープ内のメモリが割り当てられます。 2. クラス変数が初期化されると、その型に対応する値 `0` に初期化されます。例えば、次のようなクラス変数がある場合、準備フェーズが完了した後、`val` の値は `123` ではなく `0` になります。 `val` の値は、後述する初期化フェーズの後に `123` にコピーされます。
3. 定数の場合、対応する値はコンパイルフェーズ中にフィールドテーブルの `ConstantValue` 属性に格納されるため、準備フェーズが終了した後、定数の値は `ConstantValue` で指定された値になります。たとえば、以下に示すように、準備フェーズが終了した後、`val` の値は `123` になります。
分析 解決フェーズは、仮想マシンが定数プール内のシンボリック参照を直接参照に置き換えるプロセスです。 シンボリック参照: シンボリック参照では、参照先を記述するために一連のシンボルが使用されます。シンボルは、使用時にターゲットを明確に特定できる限り、任意の形式のリテラルにすることができます。シンボリック参照は仮想マシンによって実装されるメモリ レイアウトとは独立しており、参照されるターゲットは必ずしもメモリにロードされるわけではありません。 直接参照: 直接参照は、ターゲットを直接指すポインター、相対オフセット、または間接的にターゲットを特定できるハンドルになります。直接参照は、仮想マシンによって実装されたメモリ レイアウトに関連します。直接参照がある場合、参照先はメモリ内にすでに存在している必要があります。 初期化 クラスの初期化フェーズは、クラスで定義された Java プログラム コードが実際に実行を開始するフェーズです。初期化とは、単にクラス コンストラクターを呼び出すことを意味します。 1. クラスコンストラクタ 2. ` 3. 親クラスのクラス コンストラクターは子クラスのクラス コンストラクターよりも優先されるため、親クラスの `static{}` コード ブロックも子クラスの `static{}` よりも優先されます。 4. クラスコンストラクタ 5. インターフェースには `static{}` は存在できませんが、インターフェースにはクラス変数が存在する可能性があり、したがってインターフェースにはクラスコンストラクターも存在する可能性があります。 6. 仮想マシンはクラスの |
<<: Amazon SageMaker が中国の AWS 寧夏および北京リージョンで利用可能になりました
>>: JVM とは何ですか?動作メカニズムと基本原理についての簡単な説明
今日の訪問者の検索思考は、以前の訪問者のそれとはまったく異なります。以前は、訪問者はインターネットで...
Ant Groupは7月4日、信頼できるプライバシーコンピューティングフレームワーク「Ant Lan...
ロイター通信によると、中国のウェブサイトを監視するGreatfire.orgは、中国におけるAppl...
アリババクラウドは5月30日、グローバルトランザクションサービス製品「GTS」が正式に商用化されたと...
諺にもあるように、「千人の読者の目には千のハムレットがある」。 Kubernetes にも同じことが...
最近、テンセントは組織構造の調整とモバイルインターネット戦略のアップグレードを発表しました。テンセン...
2020年、私たちは新型コロナウイルス感染症のパンデミックによってデジタルトランスフォーメーションが...
IT に関して確かなことが 1 つあるとすれば、クラウドへの投資は決して遅すぎることはないということ...
オンラインマーケティングとウェブサイトプロモーションの人気が高まるにつれて、多くの初心者が独自のオン...
今から、.xyz ドメイン名を特別価格で登録できるようになります。特別価格はどのように機能しますか?...
ジャンクサイトは、過去数回の百度の調整で深刻な被害を受けました。ジャンクサイトのほとんどは百度によっ...
かつては、多くの人がビッグデータとクラウドコンピューティングを別々のテクノロジーとして見ていました。...
デスクトップ仮想化テクノロジは、セキュリティ、管理性、柔軟性を向上させることが期待されているため、関...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス新しい公開アカウントはど...
先週金曜日、淘宝連盟「武林会議」が杭州で開催されました。会議で、タオバオ・アライアンスは、アリママが...