要点を述べる まず、面接の質問を紹介しましょう
なぜ?なぜ?これは、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 とは何ですか?動作メカニズムと基本原理についての簡単な説明
SEO 業界は参入障壁が低く、競争がますます激しくなっています。さらに、検索エンジンは SEO 業界...
Hosthatch はフロリダ州タンパに登録されています。Facebook でハードウェア機器を公開...
crissic、KVM に行く時間です。タイトルを正しく読んだとおりです! Crissic は設立当...
ウェブサイトの重みは、ウェブサイトを評価する上で重要な要素です。ウェブマスターとして、自分が担当する...
ITL グループは、1995 年から運営されている、非常に歴史のある IT 企業です。早速、同社の ...
ExtraVMは2000年に設立されたアメリカの企業で、主に高防御VPS事業を展開しています。現在、...
EvoBurst のサブブランド virtwire.com は、エイプリルフールにオランダのデータセ...
月収10万元の起業の夢を実現するミニプログラム起業支援プラン2016年、AlphaGoが世界囲碁チャ...
SEO 業界では、一人で取り組むことは珍しいことではありません。多くのウェブマスターが複数の役割を担...
最近、誰もが自分のウェブサイトに大きな変化が起きたと感じています。最も明らかな変化は、誰もが最も懸念...
この世に王はいない。この世は不公平だ。この世には競争がある。競争の法則に従うことによってのみ生き残る...
1999年に設立されたDangdang.comは、14年間の電子商取引のキャリアの中で浮き沈みを経験...
一般的に、中小企業のウェブサイト所有者は、最初はあまり気にしていませんでした。彼らは自分の企業がより...
Sharktech デンバー データ センターには、DDOS 保護 (デフォルト 15G/14Mpp...
IDC の世界半期パブリック クラウド サービス追跡レポートの最新結果によると、世界のパブリック ク...