Java 仮想マシン 2 の構造

1 実行時データ領域

JVM は、プログラムの実行のためにさまざまな実行時データ領域を定義します. その中には、JVM の起動時に作成され、JVM の終了時に破棄されるデータ領域と、スレッドごとに独立したデータ領域として作成されるデータ領域があります.各スレッドの作成時に生成され、スレッドの終了時に破棄されます。

1.1 pc レジスタ

プログラム カウンター レジスター。JVM は同時に複数のスレッドの実行をサポートします。各 JVM スレッドには、スレッドとは独立したプログラム カウンター レジスターがあります。各 JVM スレッドは、現在のメソッドとも呼ばれる単一のメソッドのコードをいつでも実行します。スレッドの。スレッドの現在のメソッドがネイティブ ローカル メソッドでない場合、プログラム カウンター レジスタには、現在実行されている JVM 命令のアドレスが含まれます。スレッドの現在のメソッドがネイティブ ローカル メソッドである場合、JVM プログラム カウンター レジスタのアドレス値未定義です。JVM カウンタ レジスタには、returnAddress またはネイティブ ポインタを収容するのに十分な幅があることがわかります。

1.2 Java 仮想マシン スタック

各JVMスレッドにはプライベートなJVMスタックがあり、JVMスレッドが作成されると、そのスレッドに対応するJVMスタックも作成され、プログラム実行のフレームがJVMスタックに保存されます(フレーム、実行された各メソッドがフレームに対応し、メソッド呼び出しが完了すると、メソッドに対応するフレームが破棄されます)、JVM スタックは C 言語のスタックに似ており、ローカル変数と部分的な実行結果は、メソッド呼び出しとメソッドの戻りのためにスタックに保存されます。フレームのプッシュとポップを除いて、JVM スタックは直接操作されません。フレームはアプリケーション ヒープになる可能性があり、JVM スタックのメモリ空間は必ずしも連続したアドレス空間である必要はありません。つまり、JVM スタックはそうではありません。物理メモリ空間は、論理的にスタックを形成できます。

JVM スタックは固定サイズまたは動的拡張をサポートしており、必要に応じてスタック領域を計算して圧縮できます. スタック領域が固定サイズの場合は、スタックの作成時にアドレス空間を個別に選択する必要があります. 実装に関しては、JVM はプログラマーまたはユーザーに、JVM スタックの初期化サイズ、動的な拡張と圧縮、および JVM スタックの最大値と最小値の設定を制御できるようにします。次の条件:

  • 計算中にスレッドが必要とするスタック領域が、JVM スタックで許可されている値よりも大きい場合、JVM は StackOverflowError 例外をスローします。

  • JVM スタックを動的に拡張できる場合、スタックを拡張するときに必要なメモリ領域が不足し、スレッドを作成するときに必要なメモリ領域が不足する場合、JVM は OutOfMemoryError 例外をスローします。

1.3 ヒープ

JVMヒープ領域は、すべてのJVMスレッドによって共有されるメモリー領域です。JVMヒープ領域は、ランタイム・データ領域です。すべてのJVMクラス・インスタンスおよび配列は、JVMヒープ領域からメモリー領域に適用されます。JVMヒープ領域は、JVMの起動時に作成されます。 , ヒープ領域内のJavaオブジェクトの記憶域はリサイクルおよび再利用できます. この自動ストレージ管理システムはガベージコレクター (ガベージコレクター) と呼ばれます. Javaオブジェクトはアドレスアプリケーション空間を明示的に解放することはありません.
実装に関しては、JVM はプログラマーまたはユーザーに、JVM ヒープの初期化サイズ、動的な拡張と圧縮、および JVM ヒープの最大値と最小値の設定を制御できるようにします。次の条件:

  • JVM ヒープを動的に拡張でき、自動ストレージ管理システムが必要とするメモリ領域が不足している場合、JVM は OutOfMemoryError 例外をスローします。

1.4 メソッドエリア

(つづく)

おすすめ

転載: blog.csdn.net/uesowys/article/details/129625713