序文 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 つの状況を例に挙げて説明しましょう。
フローチャートは次のように更新できます。 分析 解析フェーズでは、JVM が定数プール内のシンボリック参照を直接参照に置き換えます。 簡単に言うと、私たちが書いたコードでは、変数がオブジェクトを参照する場合、この参照は .class ファイル内にシンボリック参照として保存されます。解析フェーズでは直接参照として解析する必要があります。直接参照がある場合、参照先はメモリ内にすでに存在している必要があります。 フローチャートは次のように更新できます。 初期化 準備フェーズでは、JVM にロードされたクラスにメモリ領域を割り当て、クラス変数に初期値を割り当てました。 クラスで定義された Java プログラム コードが実際に実行を開始するのは、初期化フェーズになってからです。主な手順は次のとおりです。
クラス内の変数代入文と静的文は上から下へ順番に実行され、クラスまたはインターフェースが Java プログラムによって初めてアクティブに使用されたときにのみ初期化されます。親クラスがある場合は、親クラス内の変数代入文と静的文が最初に順番に実行されます。 フローチャートは次のように更新できます。 要約する 静的メソッド内で非静的変数を直接使用することはできません。静的メソッドを使用する場合は、静的メソッドが配置されているクラスのみを初期化します。この時点では、静的変数にのみ値が割り当てられ、非静的変数には値が割り当てられません。したがって、非静的変数は静的メソッド内で直接使用することはできません。 |
>>: VMware: 革新的なエコシステムの構築を推進し、企業のデジタル変革を実現
Citrix Systems は、8 月 17 日に初めて北京で iForum 仮想コンピューティン...
かつては、トラフィックを増やしてウェブサイトの負荷を軽減し、良いランキングを獲得することがウェブマス...
中小規模のウェブサイトは、その特性上、適切なトピックを選択することが特に重要です。ウェブサイトが適切...
Raksmart は、米国西海岸ロサンゼルスで、無制限 VPS を年間わずか 9 ドルという前代未聞...
2019 年の 5G の開始により、通信業界は新たな時代を迎えました。レイテンシー、接続数、信頼性な...
10月19日、2021年雲奇カンファレンスにおいて、アリババクラウドインテリジェンスの張建鋒社長は、...
最近、地元で有名なコミュニティである杭州19階がコミュニティ複製計画を公表しました。このモデルが成功...
デジタル政府とスマートシティ構築の継続的な最適化により、政府部門のビジネスニーズはますます多様化して...
記事も長い間書いてないし、ブログも長い間更新してない。ちょっと退廃的な気分です。ハハ、今日は仕事が終...
Kubernetes は、その境界内にあるすべてをリソースとして抽象化します。主要部分は、Deplo...
4月19日、デュレックス微博は他のブランドとのインタラクティブな微博投稿をいくつか投稿した。中でも、...
[51CTO.com からのオリジナル記事] Apache Kafka は、Scala と Java...
成都ビジネスデイリーのマイクロコミュニティ「紅星制作チーム」は、立ち上げ以来、数万回の訪問と多くのア...
概要: ハードウェア インテリジェンスは、今日最も注目されている開発方向となっています。しかし、現在...
いかなる技術にも二面性があります。善良な人々の手に渡れば、それは比類のない剣となり、無限の利益をもた...