JAVA仮想マシン(JVM)の詳しい紹介(5) - クラスローディングの仕組み
前回の記事では Class ファイルについて説明しましたが、今回は仮想マシンがこれらの Class ファイルをどのように読み込むかについて説明します。 Class ファイル内の情報は、仮想マシンに入った後どうなりますか?これにはクラスロードメカニズムが関係します。
クラス読み込みメカニズムは、クラス ファイルからクラス データをメモリに読み込み、データを検証し、変換、解析、初期化し、最後に仮想マシンで直接使用できる Java 型を形成することです。 。この一連の処理はプログラムの実行中に完了します。
クラス ローダー
クラス ローダーは、以下の図の赤いボックス内の部分であり、完全修飾名を通じてこのクラスを記述するバイナリ バイトを取得します。 class.Stream を使用して、Java クラスを JVM のメモリ空間に動的にロードします。
#適用可能なシナリオ
配列クラスの場合、クラス ローダーを経由せずに Java 仮想マシンによって直接作成されます。
親委任メカニズム
親委任メカニズムは、クラス ローディングで使用されるメソッドです。クラスローダーがクラスロード要求を受信した場合、最初にクラス自体をロードしようとするのではなく、要求を親クラスローダーに委任して完了させます。これは、クラスローダーのすべてのレベルに当てはまります。親ローダーがリクエストを完了できないと報告した場合にのみ、子ローダーはそれを単独でロードしようとします。
お父さんは言いました:いいえ
それからお父さんはおじいちゃんに尋ねました:お父さん、お父さん、掘削機を持っていますか?
おじいちゃんは言いました:いいえ
それからおじいちゃんはひいおじいちゃんに尋ねました:お父さん、お父さん、掘削機は持っていますか?
おじいちゃんは言いました:私もそうではありません。ひ孫さんに買ってもらいましょう。
その結果、シャオミンは喜んで自分でおもちゃの掘削機を購入しました。
カテゴリ
スタートアップ クラス ローダーは C で実装されており、仮想マシン自体の一部です。他のクラス ローダーは、仮想マシンとは独立して Java 言語で実装され、すべて抽象クラス java.lang.ClassLoader を継承します。
利点
String クラスを例に挙げます。ユーザーが自分で String クラスの実装を作成した場合でも、このクラスをロードするときは、JDK 内の元の String クラスをロードするために起動クラス ローダーに委任されるだけであり、カスタム String クラスはロードされません。これにより、システムのセキュリティが確保されます。 #クラスのロードはいつ実行されますか?クラスをすぐにロードする方法は次の 5 つだけです (1) new を使用してオブジェクトをインスタンス化する場合、クラスの静的フィールドを読み取るか設定する場合 (final によって変更され、すでにコンパイルされています) ) (結果が定数プールの静的フィールドに入れられる場合を除く); クラスの静的メソッドを呼び出すとき。 (2) java.lang.reflect パッケージのメソッドを使用してクラスへのリフレクション呼び出しを行う場合。クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。 (3) クラスを初期化するときに、その親クラスが初期化されていないことが判明した場合は、最初に親クラスの初期化をトリガーする必要があります。 (4) 仮想マシンの起動時に、ユーザーは実行するメイン クラス (main() メソッドを含むクラス) を指定する必要があり、仮想マシンはまずメイン クラスを初期化します。 クラスロードプロセスの詳細説明 #開発者はカスタム クラス ローダーを通じて参加できます 初期化フェーズ # では、開発者のコードを実行して、クラス変数やその他のリソースを初期化します ( #1)。 #仮想マシンが完了する必要があること: (1) クラスの完全修飾名を使用して、このクラスを定義するバイナリ バイト ストリームを取得します。 (2) このバイト ストリームで表される静的ストレージ構造をメソッド領域の実行時データ構造に変換します。 (3) このクラスを表す java.lang.Class オブジェクトを、メソッド領域内のこのクラスのさまざまなデータへのアクセス エントリとしてメモリ上に生成します。 #2. 検証 ファイル形式検証、メタデータ検証、バイトコード検証、シンボル参照検証の 4 つのステップに分かれています。このうち、ファイル形式の検証はバイトストリームに対して直接動作し、残りの 3 項目はメソッド領域で実行されます。 3. 準備 この段階は、クラス変数に正式にメモリを割り当て、クラス変数の初期値を設定する段階です。メソッド領域に配置されます。注意点は 2 つあります。 (2) クラス変数が最終変更されていない場合、その初期値はデータ型のゼロ値になります。たとえば、int 型は 0、boolean 型は false です。例を挙げて説明します。 public static int value=123;
public static final int value=123;
現時点ではfinalがあるため、準備段階で値は123に割り当てられています。
4. 解析
解析フェーズは、仮想マシンが定数プール内のシンボル参照を次のものに置き換えるプロセスです。直接の参照。クラスまたはインターフェイス、フィールド、クラス メソッド、インターフェイス メソッドなどを解析できます。 シンボリック参照とは: シンボリック参照とは、クラス情報、メソッド名、メソッドパラメータなどの情報を含む文字列で、クラスのメソッドテーブルで使用されます。実際に使用する場合は、該当する方法を探してください。 直接参照とは: 直接参照はオフセットであり、 class メソッドのバイトコードの開始位置。 5. 初期化 このステージは、クラス変数とその他のリソースを初期化するために使用されます。これは、実行クラス コンストラクター()メソッド処理とは、クラス内に定義された Java プログラムコードが実際に実行を開始する処理です。 上記は、JAVA 仮想マシン クラスのロード メカニズムの詳細な説明です。その他の関連する質問については、PHP 中国語 Web サイトを参照してください: JAVA ビデオ チュートリアル
シンボル リファレンスは、このメソッドのいくつかの特性を示しています。これらの特性を使用して、対応するメソッドを見つける必要があります。直接引用とは、このメソッドがどこにあるかを直接伝えることを意味します。
以上がJAVA仮想マシン(JVM)の詳しい紹介(5) - クラスローディングの仕組みの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











このプロジェクトは、開発者が複数のリモート ホスト JVM をより速く監視できるように設計されています。プロジェクトが Spring Boot の場合、統合は非常に簡単です。jar パッケージを導入するだけです。Spring Boot でない場合でも、落胆する必要はありません。 Spring Boot プログラムを手早く初期化し、自分で導入する Jar パッケージで十分です

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

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

Java は人気のあるプログラミング言語ですが、Java アプリケーションの開発中に、JVM メモリ オーバーフロー エラーが発生する場合があります。通常、このエラーによりアプリケーションがクラッシュし、ユーザー エクスペリエンスに影響を与えます。この記事では、JVM メモリ オーバーフロー エラーの原因と、そのようなエラーに対処および回避する方法について説明します。 JVMメモリオーバーフローエラーとは何ですか? Java 仮想マシン (JVM) は、Java アプリケーションの実行環境です。 JVM では、メモリはヒープ、メソッド領域、スタックなどの複数の領域に分割されます。ヒープは作成されたオブジェクトを保存するために使用されます

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

JVM 原理の詳細な説明: Java 仮想マシンの動作原理を詳しく調べるには、特定のコード例が必要です。 1. はじめに Java プログラミング言語の急速な発展と広範な応用により、Java 仮想マシン (JavaVirtualMachine、JVM と呼ばれます) が登場しました。 )もソフトウェア開発には欠かせないものとなっています。 Java プログラムの実行環境として、JVM はクロスプラットフォーム機能を提供し、Java プログラムをさまざまなオペレーティング システムで実行できるようにします。この記事では、JVM の仕組みについて詳しく説明します。

JVM メモリ パラメータ設定: ヒープ メモリ サイズを合理的に調整するにはどうすればよいですか? Java アプリケーションでは、JVM はメモリの管理を担当する主要なコンポーネントです。このうちヒープ メモリはオブジェクト インスタンスの保存に使用され、ヒープ メモリのサイズ設定はアプリケーションのパフォーマンスと安定性に重要な影響を与えます。この記事では、ヒープメモリサイズを合理的に調整する方法を具体的なコード例とともに紹介します。まず、JVM メモリに関する基本的な知識を理解する必要があります。 JVM のメモリは、ヒープ メモリ、スタック メモリ、メソッド領域などを含むいくつかの領域に分割されます。で

JVM が 32 ビットか 64 ビットかを確認する Java プログラムを作成する前に、まず JVM について説明します。 JVM は Java 仮想マシンであり、バイトコードの実行を担当します。これは Java ランタイム環境 (JRE) の一部です。 Java はプラットフォームに依存しませんが、JVM はプラットフォームに依存することは誰もが知っています。オペレーティング システムごとに個別の JVM が必要です。 Java ソース コードのバイトコードがあれば、JVM により任意のプラットフォームで簡単に実行できます。 Java ファイル実行のプロセス全体は次のとおりです。まず、Java ソース コードを .java 拡張子で保存し、コンパイラがそれを .class 拡張子を持つバイトコードに変換します。これはコンパイル時に発生します。さて、実行時に、J
