メモリ領域
プログラムカウンタ
これはプロセッサ内のプログラムカウンタの機能と似ていますが、次のバイトコードのアドレスを記録します
しかし、プロセッサのプログラムカウンタは、jvmでプログラムを処理します。カウンタはスレッドを処理します
そのため、jvmのプログラムカウンタはスレッドに対してプライベートであり、スレッド間のプログラムカウンタは互いに干渉しません
次のバイトコードのアドレスを記録するため、 Java のネイティブ メソッド サービスは間違っています。ネイティブ メソッドは、CPU のプログラム カウンターによって制御されるプロセスを直接開始します。プログラム カウンターは、仮想マシン スタックで OutOfmemoryError をスローしない唯一の領域です。 CPU 内のスタックの機能も同様です。スタック フレームは、ローカル変数テーブル、オペランド スタック、メソッド出口を記録します。 。このメソッドを終了するときは、現在のスタック フレームをポップします
仮想マシンのスタックはメソッド サービス向けであるため、スレッドプライベートです
ローカル変数テーブルは、メソッド Type のローカル変数を記録します(int、boolean、char、...、参照型など) とこの変数のメモリアドレス
ヒープ
この領域が最も重要です。被験者は生きています。当然、ガベージコレクターも注目します。
この領域はオブジェクトのインスタンスを格納する役割を担っており、オブジェクトのメモリ空間がここに割り当てられます。ほとんどのオブジェクトがここに存在するため、すべてのスレッドによって共有される領域になります。
大部分のオブジェクトは生存期間が短く、新しい世代で生き続けます。したがって、新生代の地域は通常、旧時代の地域よりも広いです。
メソッド領域
メソッド領域は、ロードされたクラスの情報を記録します。完全修飾名 (パッケージ名 + クラス名)、メソッド、フィールド、記述子、パラメーター、定数、静的変数など。この領域もすべてのスレッドで共有されます。
このエリアには「永遠の時代」という名前もあり、このエリアがめったにクリアされないことを意味します。クラスのクリーンアップ範囲は非常に小さく、クラスが不要になったかどうかを判断するための要件がより厳しいため、ガベージ コレクターがこの領域をクリーンアップすることはほとんどありません。
この領域は、コンパイル中に生成されたリテラルおよびシンボル参照を記録します。また、すべてのスレッドで共有されます。
jdk1.7 から、ランタイム定数プールがヒープに分割されました。定数が初めて出現した場合、その定数は実行時定数プールにコピーされなくなりますが、定数が初めて出現するメモリ アドレスを指す参照は実行時定数プールに保持されます。
ダイレクトメモリ
この領域は実際にはjvmの一部ではなく、他のプロセスに属します。ネイティブ メソッドが呼び出されるとき、ダイレクト メモリが生成される場合があります。
ダイレクトメモリとは、ネイティブメソッドで使用されるメモリ空間を指します。たとえば、NIO 操作では、ファイルの読み取りと書き込みにネイティブ メソッドが使用されます。このとき、ファイルの読み取りと書き込み用のメモリ (キャッシュ) を指すダイレクト メモリが生成されます。
ダイレクト メモリは jvm にはありませんが、メモリ空間のダイレクト メモリを指す参照が jvm ヒープに維持されることに注意してください。これにより、NIO と同様の操作でメモリ空間と Java ヒープの間でデータが頻繁にコピーされることが回避されます。