JVMクラスローディングメカニズムに関しては、この記事で十分です

JVMクラスローディングメカニズムに関しては、この記事で十分です

序文

1ヶ月間更新してませんでした。今月はいろいろなことが起こり、更新頻度が大幅に減少しました。どれだけ努力しても、技術研究で遅れをとることはできません!

JVMとは

通常、コードは .java ファイルに記述します。これらをマシンにデプロイして実行するにはどうすればよいでしょうか? jar または war パッケージにパッケージ化し、デプロイして実行します。

jar パッケージの内容を読んだことがあれば、作成したすべての .java ファイルが .class ファイルにコンパイルされていることがわかります。

ここで非常に重要なステップであるコンパイルが行われます。つまり、作成したプログラムを JVM が理解できるファイル形式に変換します。

各クラスは、内部クラスも含めて .class ファイルにコンパイルされることに注意してください。つまり、各 .class ファイルはコード内の 1 つのクラスにのみ対応します。

クラスのライフサイクル

クラスが JVM メモリにロードされてからメモリからアンロードされるまでのライフ サイクルは、ロード -> 検証 -> 準備 -> 解析 -> 初期化 -> 使用 -> アンロードに分けられます。

これを一つずつ説明しましょう:

負荷

jar パッケージが生成されると、作成したすべてのプログラムは、JVM が理解できる .class 形式にコンパイルされます。この時点で、コンパイルされた .class ファイルを jvm にロードする必要があります。この時点で、「クラスローダー」という概念が存在します。下記の通りです。

次の質問は、クラス ローダーが .class を JVM にロードするのはいつでしょうか?つまり、どのような状況でクラスがロードされるのでしょうか?

jar パッケージの実行中は、エントリ メソッドとして main() メソッドが指定されます。まず、main() メソッドが配置されているクラスが jvm にロードされ、コード実行で new が発生すると、オブジェクトは引き続き jvm にロードされます。

まとめると、コード内でこのクラスを使用する必要がある場合、クラスは JVM にロードされます。

確認する

これはあまり深く理解する必要はありません。非常に単純な真実です。どのような猫や犬でも JVM にロードできるわけではありません。そうでないと、混乱が生じます。したがって、この段階では、ロードされた .class ファイルが指定されたルールを満たしているかどうかを確認します。

興味深いのは、すべての .class ファイルが非常にロマンチックであることです。すべての .class ファイルは、Coffee Baby を意味する 8 桁の 16 進文字 0×CAFEBABE で始まるからです。ロマンチックですよね?検証フェーズの最初のステップは、.class ファイルが CoffeeBaby で始まるかどうかを確認することです。

フローチャートは次のように更新できます。

準備する

.class ファイルを jvm に合法的にロードすると、この時点でいくつかの準備作業が行われます。

まず、このクラスにメモリ領域を割り当て、次にクラス変数 (static によって変更される変数) にデフォルトの初期値を割り当てます。ただし、クラス変数も final によって変更された場合は、初期値ではなく特定の値が割り当てられます。

次の 2 つの状況を例に挙げて説明しましょう。

  1. パブリッククラスStudent{
  2. プライベートスタティック 年齢= 18;
  3. }
  4. //この時点で、age 変数にメモリ領域が割り当てられ、初期値 0 が割り当てられます。
  5. パブリッククラスStudent{
  6. プライベート静的最終int年齢 = 18;
  7. }
  8. //age が final によって変更されると、age 変数にメモリ領域が割り当てられ、その値に 18 が割り当てられます。

フローチャートは次のように更新できます。

分析

解析フェーズでは、JVM が定数プール内のシンボリック参照を直接参照に置き換えます。

簡単に言うと、私たちが書いたコードでは、変数がオブジェクトを参照する場合、この参照は .class ファイル内にシンボリック参照として保存されます。解析フェーズでは直接参照として解析する必要があります。直接参照がある場合、参照先はメモリ内にすでに存在している必要があります。

フローチャートは次のように更新できます。

初期化

準備フェーズでは、JVM にロードされたクラスにメモリ領域を割り当て、クラス変数に初期値を割り当てました。

クラスで定義された Java プログラム コードが実際に実行を開始するのは、初期化フェーズになってからです。主な手順は次のとおりです。

  1. クラスの静的変数に正しい初期値を割り当てます。
  2. クラスの静的コード ブロックを実行します。

クラス内の変数代入文と静的文は上から下へ順番に実行され、クラスまたはインターフェースが Java プログラムによって初めてア​​クティブに使用されたときにのみ初期化されます。親クラスがある場合は、親クラス内の変数代入文と静的文が最初に順番に実行されます。

フローチャートは次のように更新できます。

要約する

静的メソッド内で非静的変数を直接使用することはできません。静的メソッドを使用する場合は、静的メソッドが配置されているクラスのみを初期化します。この時点では、静的変数にのみ値が割り当てられ、非静的変数には値が割り当てられません。したがって、非静的変数は静的メソッド内で直接使用することはできません。

<<:  9つのマルチクラウド管理プラットフォームの評価

>>:  VMware: 革新的なエコシステムの構築を推進し、企業のデジタル変革を実現

推薦する

JVMの動作原理とスタックとヒープの実装プロセスの詳細な説明

[[267906]]概要オンライン システムでは CPU 100% 問題が発生するため、トラフィッ...

2018 年のクラウド コンピューティングのトレンド予測: SaaS、ハイブリッド クラウド、クラウド ストレージ、IoT

クラウド テクノロジーが企業内で人気を博し続けるにつれ、IT インフラストラクチャの取得モデルを設備...

動画サイトVIP、価値はあるけど本当に役に立たなさそう

VIP(Very Important Person)は、優等生、上級ユーザー、上級会員などと呼ばれる...

道徳経からネットワークマーケティングの真髄を学ぶ

老子の『道徳経』は道教の重要な古典であり、中国、さらには西洋にも多大な影響を与えてきました。 『道徳...

virmach-34 USD/E3-1240V2/32G メモリ/2X1T ハードディスク/12IP/10T トラフィック/IPMI

私のブログを長い間フォローしている若い人たちは、8月にvirmachが初めてサーバー上で起動されたと...

51CTO 独占: 2011 IBM クラウド コンピューティング サミットの秘密

北京から上海まで1,400キロ以上あります。私と私の同僚は、明日 IBM が開催する2011 クラウ...

モモのトラフィック戦略:ゲートキーパーの構築とロングテールの創出

昨年末、360創始者の周紅一氏は「インターネット階級の強化」という概念を何度も提唱した。インターネッ...

IIS ログからスパイダーのクロール時間を分析して、クイックコレクション Web サイトを作成し、元のコンテンツをタイムリーに保護します。

ウェブマスターは、権威の高いウェブサイトがオリジナル コンテンツを収集し、そのオリジナル コンテンツ...

クラウド変更管理戦略を適応するための 3 つのルール

変更に関しては、変更管理戦略を立てることでリスクを最小限に抑えることができます。クラウドの変更管理戦...

頻繁にキューしてください! JD Cloudが2020年TOP100サミットの「テクノロジーモデル」に選出

12月17日から20日まで、2020 TOP100グローバルソフトウェアケーススタディサミット(以下...

中国のソーシャルリクルートメントは急速に発展しており、Weiboは新興プラットフォームとなっている

世界中の多くの企業が採用活動にソーシャルメディアを活用する方法を研究しており、中国市場の状況は参考に...

Baiduの資産を見てみましょう

百度の香港上場再開に関する重要な情報が公開された。百度は3月12日に世界規模の株式公開を開始し、公開...

日常生活で観察したマーケティング

昨日、私は自分自身に尋ねました。なぜ一部の人々は何をしても常に成功するのでしょうか?なぜ一部の人々は...