jvmのメモリ構造

1883 ワード

JVMのメモリ構造
JVMは実行時データの記憶構造に従ってメモリ構造を区分し、JVMはjavaプログラムを実行する際に、それらをいくつかの異なるデータ構造に区分し、それぞれ異なる領域に格納する.JVMの仮想仕様では、6種類に分けられています.1、pcカウンタ:pcカウンタ、プログラムカウンタとも呼ばれ、現在正常に実行されているプログラムを保存するためのメモリアドレスです.スレッドはcpu呼び出しの最小ユニットであるためjavaプログラムはマルチスレッドで実行される.すなわち、PCカウンタは、各スレッドが現在動作している仮想マシンバイトコード命令アドレスをメモする必要がある.もちろん実行するnativeメソッドです.それ自体はバイトコードにコンパイルされておらず、もちろんバイトコードアドレスは存在しない.このときに記録されているのはundefined.2、javaスタックjavaスタックはスレッドに関連付けられており、1つのスレッドを作成するたびにjVMはこのスレッドのためにJAVAスタックを作成する.ライフサイクルはスレッドと同じです.各メソッドが実行されると、ローカル変数、オペレーションスタック、ダイナミックリンク、メソッド出口などの情報に使用されるスタックフレームが同時に作成され、各メソッドが実行が完了するまで呼び出されると、javaスタック内でスタックからスタックを出るプロセスに対応します.3、javaスタックjavaスタックはjavaオブジェクトを格納する場所であり、この領域はオブジェクトインスタンスを格納するために使用され、javaスタックはゴミ回収の主な領域であり、スタックはすべてのスレッドが共有する領域であり、特に同期の問題に注意しなければならない.インスタンスに割り当てられるメモリがスタック内に存在し、スタックのサイズが拡張できない場合、OutOfMemoryError異常が放出されます.4、メソッド領域:メソッド領域はクラス構造情報を格納する場所であり、javaスタックと同様に、各スレッドが共有する領域である.主に、仮想マシンにロードされたクラス情報、定数、静的変数などのデータを格納するために使用されます.5.定数プール運転時定数プール(Runtime Constant Pool)はメソッドエリアの一部である.Classファイルには、クラスのバージョン、フィールド、メソッド、インタフェースなどの記述などの情報のほかに、コンパイル中に生成された様々な字面量およびシンボル参照を格納する定数プール(Constant Pool Table)があり、クラスロード後にメソッド領域のランタイムプールに格納される6、ローカルメソッドスタックnativeスタックjvmは、nativeメソッドを実行するために準備された空間である.以上がJVMのメモリ構造モデル
では、JVMはどのようにメモリを割り当てているのでしょうか.通常、表示されるメモリの割り当て方法は、静的メモリの割り当てと回収、動的メモリの回収と割り当ての2つです.
静的メモリの割り当てとは、プログラムがコンパイルの段階で必要なメモリ空間を知っていることを意味します.プログラムがシステムにロードされると、メモリを一度に割り当てます.動的メモリ割り当てとは、java内のオブジェクトのメモリ領域が動的に割り当てられていることを意味し、動的割り当てとは、プログラムが実行されるときに、現在割り当てる必要があるメモリ領域のサイズを知ることです.コンパイル時に確定したのではありません.簡単な例を挙げる.
public void testHello(int abc){
		String s = "sdfjasjd";
		long heightL = 1;
		Object o = new Object();
		Integer i = 0;
}

このメソッドではabcとheightL変数のメモリサイズプログラムをコンパイルすると、このメソッドを実行するとJavaスタックにスペースが割り当てられることがわかります.変数sとoおよびiはいずれもオブジェクトに属する.javaスタックに動的に割り当てられます.メソッドの実行が完了すると、abcとheightLのメモリが解放されます.s,o,iなどは,引用されないことが確定した場合にもシステムによって回収される.