この記事では、JVM アーキテクチャを画像とテキストで詳しく説明します
JVM は、スタックアーキテクチャ に基づく抽象コンピューターであり、Java のクロスプラットフォーム解釈の基礎となる独自の命令セットとメモリ管理を備えています。または、バイトコードを実行用のネイティブ コードにコンパイルします。 Java 仮想マシンのアーキテクチャは次のとおりです。
Class File は、JVM によって実行できるバイトコードを含む、プラットフォームに依存しないバイナリ ファイルです。マルチバイトはビッグ エンディアンです。変更された UTF-8 エンコーディングを使用します。 Class ファイルは、クラスまたは インターフェース の情報を正確に記述します。以下を含みます:
定数プール: 数値定数および文字列リテラル定数、クラス名、メソッド名、パラメーター、およびさまざまなシンボル などのメタデータ
メソッドのバイトコード命令、パラメータの数、ローカル変数、オペランドスタックの最大深さ、例外およびその他の情報
クラスローダを指します。JVMはそれを次の目的で使用します。クラスの動的なロード、リンク、および初期化の初回。 JVM のデフォルトのローディング モデルは親委任モデルであり、クラス ローダー間には親子関係の階層があり、組み合わせを使用して内部的に実装されます。さらに、Servlet ロードなど、他のロード方法もあります。これは、最初に単独でロードを試行し、失敗した場合は上位ローダーに委譲します。OSGI ローダー間には依存関係のネットワークが存在します。上層と下層の区別がなく、より柔軟です。 Loading
Name()、ClassLoaderなどのJVMメソッド領域に対応するjava.lang.Classオブジェクトを作成することです。 .loadClass() とリフレクションはクラスの読み込みをトリガーできます。クラスのロードがトリガーされると、詳細なプロセスは次のとおりです:
がスローされます。クラス A がクラス B を参照している場合、クラス A は正常にロードされていますが、クラスファイルが見つからない場合B をロードすると、NoClassDefFoundError がスローされます。 JVM には次のクラス ローダーがあります。
ClassLoader、クラス ローダーを開始し、Java コア クラス ライブラリを
Application クラス ローダー (アプリケーション クラス ローダー) とも呼ばれ、CLASSPATH 環境変数にクラスをロードします
に合わせて。親クラスの静的フィールドは、子クラスの静的フィールドより前に初期化されます。 この時点で、クラスまたはインターフェイスがメモリにロードされ、JVM はプロセス全体がスレッドセーフであることを保証します。プロセス全体にはインスタンス オブジェクトが関与しないことに注意してください。
メソッド領域: 実行時定数プール、クラスフィールドとメソッド情報、静的変数、メソッドのバイトコードを格納するスレッド共有は、ヒープの論理部分であり、この部分でのガベージコレクションが可能です。 。 JDK8 以降、Hotspot JVM はメモリのこの部分の内容を調整し、クラス メタデータの割り当てにはローカル メモリが使用され、インターンされた String とクラスの静的変数は Java ヒープに移動されたことに注意してください。
ランタイム定数プール: これは JVM の中核的な役割を果たします。基本的に、メソッドまたはフィールドに関しては、JVM はランタイム定数プール内の特定のメモリ アドレスを検索します。
ヒープ: スレッド共有、インスタンス オブジェクト、インスタンス変数、配列の保存は、ガベージ コレクションの主な領域です。
JVM スタック: スタック フレームを保存するために使用されるスレッド プライベート。メソッドが呼び出されるときに、スタック フレームが作成され、スタックにプッシュされます。
概要
以上がJVMアーキテクチャを画像と文章で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。