JVM ---ランタイムデータ領域

JVMランタイムデータ領域

ここに画像の説明を挿入
上の図に示すように、JVMランタイムデータ領域は主に次のように分割されます。

 1. pc寄存器
 2. Java虚拟机栈
 3. Java堆
 4. 方法区
 5. 运行时常量池
 6. 本地方法栈

1.pcレジスタ

まず、JVMのpcレジスタは、基本的にJVMの小さなメモリです。Java仮想マシンは、同時に実行する複数のスレッドをサポートでき、各スレッドにはpcレジスタがあります。通常のpcレジスタと同様に、各スレッドのpcレジスタは、現在のスレッドによって実行された命令のアドレスを記録しますが、 Java仮想マシンでは、PCレジスタは少し異なります。スレッドによって実行されるコードがネイティブ(Java以外の言語で記述されたコード)である場合、pcレジスタの値は未定義です。実行されるコードがネイティブでない場合、pcレジスタは実行されるバイトコード命令のアドレスを保持します

2.Java仮想マシンスタック

Java仮想マシンで実行されている複数のスレッドの場合、各スレッドには独自の(つまり、プライベートな)Java仮想マシンスタックがあります。スレッドが開始すると、Java仮想マシンスタックも作成されます。Java仮想マシンスタックは、C言語のスタックフレームと同様に、スタックフレームを格納するために使用されます。スタックフレームは、ローカル変数や関数などに関する情報を格納するために使用されます。Java仮想マシンスタックによって使用されるメモリは不連続である可能性があります。 。
Java仮想マシンの仕様では、Java仮想マシンスタックのサイズは指定されていません。Java仮想マシンの実際の実装では、仮想マシンスタックは固定サイズにすることも、動的に変更することもできます。

  • スレッド要求によって割り当てられた容量がJava仮想マシンスタックで許可されている最大容量を超えると、Java仮想マシンはStackOverflowError例外をスローします。
  • Java仮想マシンスタックを動的に拡張でき、拡張しようとしたときに十分なメモリが適用されていない場合、または新しいスレッドを作成するときに十分なメモリがない場合、OutOfMemoryErrorがスローされます。

3.ローカルメソッドスタック

ネイティブメソッドは、Java以外の言語で記述されたメソッドです。Java仮想マシンのスレッドによって実行されるコードがネイティブメソッドからのものである場合、ネイティブメソッドスタックは、Java仮想マシンでネイティブメソッドを実行するために使用されます。Java仮想マシンの実装時にネイティブメソッドがサポートされている場合、ネイティブメソッドスタックは通常、スレッドの作成時にスレッドによって割り当てられます。Java仮想マシンスタックと同様に、ネイティブメソッドスタックも同様のStackOverflowErrorおよびOutOfMemoryError例外を発生させる可能性があります。

4.Javaヒープ

Javaヒープは、仮想マシンで実行されているすべてのスレッドによって共有されるランタイムメモリ領域であり、すべてのクラスインスタンスと配列オブジェクトがメモリを割り当てるための領域でもあります。
Java仮想マシンが起動すると、GCによって管理されるさまざまなオブジェクトを格納するJavaヒープの作成も伴い、これらのオブジェクトを明示的に破棄することできませんJavaヒープの容量は固定または動的に拡張でき、使用されるメモリは不連続になる可能性があります。
使用されているヒープがGCが提供できる最大容量を超えると、Java仮想マシンはOutOfMemoryError例外をスローします。

5.メソッドエリア

メソッド領域は、仮想マシンで実行されているすべてのスレッドによって共有されるランタイムメモリ領域でもあり、仮想マシンの起動時に作成されます。メソッド領域は、ランタイム定数プールのバイトコードコンテンツ、フィールド、メソッドデータ、コンストラクター、一般的なメソッド、クラス、インスタンスの初期化に使用されるいくつかの特別なメソッドなど、各クラスの構造情報を格納するために使用されます。およびインターフェイス。
メソッド領域の容量は、固定または動的に拡張できます。実際のメモリ空間では不連続になる可能性があります。メソッド領域のメモリがメモリ割り当て要求を満たすことができない場合、OutOfMemoryErrorがスローされます。

6.ランタイム定数プール

各ランタイム定数プールはメソッド領域に割り当てられます。クラスファイル内の各クラスまたはインターフェイスで使用される数値リテラル定数、およびランタイム分析後に取得できるメソッドとフィールドの参照は、それぞれのランタイム定数プールに格納されます。クラスまたはインターフェイスを仮想マシンにロードした後、対応するランタイム定数が作成されます。
ランタイム定数プールに必要なメモリスペースが、クラスまたはインターフェイスの作成時にメソッド領域によって提供される最大値を超えると、OutOfMemoryErrorがスローされます。

おすすめ

転載: blog.csdn.net/Miha_Singh/article/details/88688062