ホームページ Java &#&チュートリアル JVM がクラスをロードするプロセスの詳細な図による説明

JVM がクラスをロードするプロセスの詳細な図による説明

Mar 08, 2017 am 11:08 AM

この記事では主にJVMがクラスをロードするプロセスを紹介します。非常に優れた参考値です。以下のエディターで見てみましょう

クラスのロードプロセス

Javaのソースコードはクラスのバイトコードにコンパイルされ、JVMはクラスを記述するバイトコードの.Classファイルをロードします。データをメモリにロードし、データの検証、変換、分析、初期化を実行し、最終的に仮想マシンで直接使用できる Java 型を形成します。これが仮想マシンのクラス ロード メカニズムです。

クラスが仮想マシンのメモリにロードされてからメモリからアンロードされるまでのライフサイクルには、ロード、検証、準備、解決、初期化、使用 (使用)、およびアンロード (アンロード) が含まれます。 7 つの段階に分かれており、そのうち検証、準備、解析の 3 つの部分をまとめてリンクと呼びます。

ロード (ロード)、検証、準備、初期化、アンロードの 5 つの段階の順序は固定されていますが、解析段階は必ずしもこの順序で開始できるわけではありません。場合によっては初期化後に開始します。これはランタイム動的バインディング機能 (動的バインディングまたはオーバーライドなどの遅延バインディングとも呼ばれます) 用です。

1. ロード:

ロードフェーズ中に、仮想マシンは主に 3 つのことを実行します:

1. クラスの完全修飾名を使用して、このクラスを定義するバイナリ バイト ストリームを取得します。

2. このバイトストリームで表される静的ストレージ構造をメソッド領域の実行時データ構造に変換します。

3. メソッド領域データへのアクセス入口として、Java ヒープ内にこのクラスを表す java.lang.Class オブジェクトを生成します

クラス読み込みプロセスの他の段階と比較して、読み込み段階 ( (準備段階) ロードフェーズでクラスのバイナリバイトストリームを取得する動作と言われています) ロードフェーズはシステムが提供するクラスローダ(ClassLoader)を使用して完了できるため、開発期間中最も制御しやすいフェーズですまたは、ユーザーがカスタマイズできるクラス ローダーが完成し、開発者は独自のクラス ローダーを定義してバイト ストリームの取得方法を制御できます。

ロードフェーズが完了すると、仮想マシンの外部にあるバイナリバイトストリームは、仮想マシンが要求する形式に従ってメソッド領域に格納されます。メソッド領域のデータ格納形式は、仮想マシンの実装によって定義されます。仮想マシンは領域の特定のデータ構造を規定しません。次に、java.lang.Class クラスのオブジェクトが Java ヒープ内にインスタンス化されます。このオブジェクトは、プログラムがメソッド領域内のこれらのタイプのデータにアクセスするための外部インターフェイスとして機能します。

2. 検証:

検証フェーズの目的は、クラス ファイルのバイト ストリームに含まれる情報が JVM 仕様に準拠しており、JVM に害を及ぼさないことを確認することです。検証が失敗した場合は、java.lang.VerifyError 例外またはそのサブクラス例外がスローされます。検証プロセスは 4 つの段階に分かれています

1. ファイル形式の検証: バイト ストリーム ファイルがクラス ファイル形式の仕様に準拠しており、現在の仮想マシンで正しく処理できるかどうかを検証します。

2. メタデータ検証: 記述された情報が Java 言語の仕様に準拠していることを確認するために、バイトコードによって記述された情報の意味解析です。

3. バイトコード検証: 主にデータ フローと制御フローを分析し、検証されたクラスのメソッドが実行時に仮想マシンに害を及ぼさないことを確認します。

4. シンボル参照の検証: 仮想マシンがシンボル参照を直接参照に変換するときに、この変換アクションが解析フェーズ中に発生します。

3. 準備:

準備フェーズでは、変数にメモリを割り当て、クラス変数の初期化を設定します。この段階では、クラスのインスタンス変数ではなく、クラスの変数 (静的に変更された変数) のみが割り当てられます。最終的ではなくなった変数の場合、JVM は代入ステートメントの値の代わりに変数を「ゼロ値」に設定します:

pirvate static int size = 12; この段階では、size の値は 0 です。 12ではありません。 Final によって変更されたクラス変数には実数値が割り当てられます。

4. 解析:

解析フェーズは、仮想マシン定数プール内のシンボル参照を直接参照に置き換えるプロセスです。

シンボリック参照: シンボリック参照は、参照されるターゲット オブジェクトを説明するためのシンボルのセットであり、使用時にターゲットを明確に特定できる限り、シンボルは任意の形式のリテラルにすることができます。シンボリック参照は、仮想マシンによって実装されるメモリ レイアウトとは何の関係もなく、参照されるターゲット オブジェクトは必ずしもメモリにロードされる必要はありません。

直接参照: 直接参照は、ターゲット オブジェクトを直接指すポインター、相対オフセット、またはターゲットを間接的に特定できるハンドルです。直接参照は、仮想マシンのメモリ レイアウトの実装に関連しています。異なる仮想マシン インスタンス上の同じシンボル参照から変換された直接参照は、通常、同じではありません。直接参照がある場合、参照ターゲットはメモリ内にすでに存在している必要があります。

仮想マシンの仕様では、解析フェーズが発生する特定の時間を規定していません。anewarry、checkcast、getfield、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield の実行中に必要なだけです。 putstatic バイトコード命令の前に、使用するシンボル参照が最初に解析されるため、仮想マシン実装は、クラスがローダーによってロードされるときに定数プール内のシンボル参照を解析するか、シンボリック命令が実行されるまで待機するかを必要に応じて判断します。参照は使用される直前に解決されます。

解析アクションは主に、クラスまたはインターフェイス、フィールド、クラス メソッド、およびインターフェイス メソッドの 4 種類のシンボル参照に対して実行されます。コンパイル済み定数プール内の 4 つの定数タイプ CONSTANT_Class_Info、CONSTANT_Fieldref_Info、CONSTANT_Methodef_Info、および CONSTANT_InterfaceMethoder_Info にそれぞれ対応します。

1. クラスとインターフェースの分析

2. フィールドの分析

4. インターフェースメソッドの分析

5. 初期化:

クラスの初期化フェーズは、クラスのロードプロセスの最後のステップです。準備フェーズでは、クラス変数にはシステムが必要とする初期値が割り当てられています。初期化フェーズでは、主観的な値に基づいています。プログラムを通じてプログラマーによって作成された計画。クラス変数やその他のリソースを初期化します。または、別の観点から表現することもできます。初期化フェーズは、クラス コンストラクター 6 を実行します。使用:

新しいスレッド --- プログラムカウンタ ---- jvm スタック実行 (オブジェクト参照) ----- ヒープメモリ (直接参照) ----メソッド領域

7. アンインストール:

GC ガベージコレクション

以上がJVM がクラスをロードするプロセスの詳細な図による説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Illustrator でのプラグインの読み込みエラー [修正] Illustrator でのプラグインの読み込みエラー [修正] Feb 19, 2024 pm 12:00 PM

Adobe Illustrator を起動すると、プラグインの読み込みエラーに関するメッセージが表示されますか?一部の Illustrator ユーザーは、アプリケーションを開いたときにこのエラーに遭遇しました。メッセージの後には、問題のあるプラグインのリストが続きます。このエラー メッセージは、インストールされているプラ​​グインに問題があることを示していますが、Visual C++ DLL ファイルの破損や環境設定ファイルの破損など、他の理由によって発生する可能性もあります。このエラーが発生した場合は、この記事で問題を解決する方法を説明しますので、以下を読み続けてください。 Illustrator でのプラグインの読み込みエラー Adob​​e Illustrator を起動しようとしたときに「プラグインの読み込みエラー」エラー メッセージが表示された場合は、次の操作を行うことができます。 管理者として

Stremio の字幕が機能しない; 字幕の読み込みエラー Stremio の字幕が機能しない; 字幕の読み込みエラー Feb 24, 2024 am 09:50 AM

Windows PC の Stremio で字幕が機能しませんか?一部の Stremio ユーザーは、ビデオに字幕が表示されないと報告しました。多くのユーザーが、「字幕の読み込みエラー」というエラー メッセージが表示されたと報告しています。このエラーとともに表示される完全なエラー メッセージは次のとおりです: 字幕の読み込み中にエラーが発生しました 字幕の読み込みに失敗しました: これは、使用しているプラ​​グインまたはネットワークに問題がある可能性があります。エラー メッセージにあるように、インターネット接続がエラーの原因である可能性があります。したがって、ネットワーク接続を確認し、インターネットが適切に機能していることを確認してください。これとは別に、このエラーの背後には、競合する字幕アドオン、特定のビデオ コンテンツでサポートされていない字幕、古い Stremio アプリなど、他の理由が考えられます。のように

ハイパーリンクを挿入すると Outlook がフリーズする ハイパーリンクを挿入すると Outlook がフリーズする Feb 19, 2024 pm 03:00 PM

Outlook にハイパーリンクを挿入するときにフリーズの問題が発生した場合は、不安定なネットワーク接続、古い Outlook バージョン、ウイルス対策ソフトウェアによる干渉、またはアドインの競合が原因である可能性があります。これらの要因により、Outlook がハイパーリンク操作を適切に処理できない可能性があります。ハイパーリンクの挿入時に Outlook がフリーズする問題を修正する 次の修正プログラムを使用して、ハイパーリンクの挿入時に Outlook がフリーズする問題を修正します。 インストールされているアドインを確認する Outlook を更新する ウイルス対策ソフトウェアを一時的に無効にして、新しいユーザー プロファイルの作成を試行する Office アプリ プログラムを修正する Office をアンインストールして再インストールする 始めましょう。 1] インストールされているアドインを確認する Outlook にインストールされているアドインが問題の原因となっている可能性があります。

JVMメモリ管理のポイントと注意事項 JVMメモリ管理のポイントと注意事項 Feb 20, 2024 am 10:26 AM

JVM のメモリ使用量を使いこなすためのポイントと注意点 JVM (JavaVirtualMachine) は Java アプリケーションが動作する環境であり、最も重要なのは JVM のメモリ管理です。 JVM メモリを適切に管理すると、アプリケーションのパフォーマンスが向上するだけでなく、メモリ リークやメモリ オーバーフローなどの問題も回避できます。この記事では、JVM メモリ使用の重要なポイントと考慮事項を紹介し、いくつかの具体的なコード例を示します。 JVM メモリ パーティション JVM メモリは主に次の領域に分割されます。 ヒープ (ヒープ)

「PHP によるオブジェクト指向プログラミング入門: 概念から実践まで」 「PHP によるオブジェクト指向プログラミング入門: 概念から実践まで」 Feb 25, 2024 pm 09:04 PM

オブジェクト指向プログラミングとは何ですか?オブジェクト指向プログラミング (OOP) は、現実世界のエンティティをクラスに抽象化し、オブジェクトを使用してこれらのエンティティを表すプログラミング パラダイムです。クラスはオブジェクトのプロパティと動作を定義し、オブジェクトはクラスをインスタンス化します。 OOP の主な利点は、コードの理解、保守、再利用が容易になることです。 OOP の基本概念 OOP の主な概念には、クラス、オブジェクト、プロパティ、メソッドが含まれます。クラスはオブジェクトの設計図であり、オブジェクトのプロパティと動作を定義します。オブジェクトはクラスのインスタンスであり、クラスのすべてのプロパティと動作を備えています。プロパティは、データを保存できるオブジェクトの特性です。メソッドは、オブジェクトのデータを操作できるオブジェクトの関数です。 OOP の利点 OOP の主な利点は次のとおりです。 再利用性: OOP はコードをより高度なものにすることができます。

JVM コマンドラインパラメータの詳細説明: JVM の動作を制御する秘密兵器 JVM コマンドラインパラメータの詳細説明: JVM の動作を制御する秘密兵器 May 09, 2024 pm 01:33 PM

JVM コマンド ライン パラメータを使用すると、JVM の動作をきめ細かいレベルで調整できます。共通パラメータは次のとおりです。 Java ヒープ サイズの設定 (-Xms、-Xmx) 新しい世代サイズの設定 (-Xmn) パラレル ガベージ コレクタの有効化 (-XX:+UseParallelGC) Survivor 領域のメモリ使用量の削減 (-XX: -ReduceSurvivorSetInMemory) 冗長性の削除 ガベージ コレクションの削除 (-XX:-EliminateRedundantGCs) ガベージ コレクション情報の印刷 (-XX:+PrintGC) G1 ガベージ コレクターの使用 (-XX:-UseG1GC) ガベージ コレクションの最大休止時間の設定 (-XX:MaxGCPau)

PHP拡張機能の読み込み状況を確認するにはどうすればよいですか? PHP拡張機能の読み込み状況を確認するにはどうすればよいですか? Mar 27, 2024 pm 11:51 PM

PHP拡張機能の読み込み状況を確認するにはどうすればよいですか? PHP では、拡張機能とは機能を拡張するためのツールであり、さまざまな拡張機能を読み込むことで、PHP にさまざまな機能を追加できます。ただし、デバッグや問題のトラブルシューティングを容易にするために、現在の PHP 環境にどの拡張機能がロードされているかを確認する必要がある場合があります。ここでは、PHP 拡張機能の読み込み状況を確認する方法を詳しく紹介します。方法 1: phpinfo 関数を使用して phpinfo 関数を表示し、現在の PHP 環境に関する詳細情報を出力します。

JVM仮想マシンの機能と原理の分析 JVM仮想マシンの機能と原理の分析 Feb 22, 2024 pm 01:54 PM

JVM 仮想マシンの機能と原理の分析の紹介: JVM (JavaVirtualMachine) 仮想マシンは、Java プログラミング言語の中核コンポーネントの 1 つであり、Java の最大のセールス ポイントの 1 つです。 JVM の役割は、Java ソース コードをバイトコードにコンパイルし、これらのバイトコードを実行することです。この記事では、JVM の役割とその仕組みを紹介し、読者の理解を深めるためにいくつかのコード例を示します。機能: JVM の主な機能は、さまざまなプラットフォーム上での Java プログラムの移植性の問題を解決することです。

See all articles