ホームページ  >  記事  >  类库下载  >  jvmメモリ領域

jvmメモリ領域

高洛峰
高洛峰オリジナル
2016-11-05 16:34:461841ブラウズ

メモリ領域

プログラムカウンタ

これはプロセッサ内のプログラムカウンタの機能と似ていますが、次のバイトコードのアドレスを記録します

しかし、プロセッサのプログラムカウンタは、jvmでプログラムを処理します。カウンタはスレッドを処理します

そのため、jvmのプログラムカウンタはスレッドに対してプライベートであり、スレッド間のプログラムカウンタは互いに干渉しません

次のバイトコードのアドレスを記録するため、 Java のネイティブ メソッド サービスは間違っています。ネイティブ メソッドは、CPU のプログラム カウンターによって制御されるプロセスを直接開始します。プログラム カウンターは、仮想マシン スタックで OutOfmemoryError をスローしない唯一の領域です。 CPU 内のスタックの機能も同様です。スタック フレームは、ローカル変数テーブル、オペランド スタック、メソッド出口を記録します。 。このメソッドを終了するときは、現在のスタック フレームをポップします

仮想マシンのスタックはメソッド サービス向けであるため、スレッドプライベートです


ローカル変数テーブル


ローカル変数テーブルは、メソッド Type のローカル変数を記録します(int、boolean、char、...、参照型など) とこの変数のメモリアドレス


オペランドスタック

オペランドスタックは、論理演算を格納するCPUの汎用レジスタに相当します。ユニット処理された値、多くの命令はこの領域から値を読み取る必要があります (add、cmp、mov、...)



メソッド exit

ここには、現在のメソッドの処理後に実行される次の命令が記録されます アドレス


ネイティブ メソッド スタック


ローカル メソッド スタックは実際には仮想マシン スタックと似ていますが、仮想マシン スタックがバイトコードのみを提供する点が異なります


ヒープ

この領域が最も重要です。被験者は生きています。当然、ガベージコレクターも注目します。

この領域はオブジェクトのインスタンスを格納する役割を担っており、オブジェクトのメモリ空間がここに割り当てられます。ほとんどのオブジェクトがここに存在するため、すべてのスレッドによって共有される領域になります。

ヒープも新世代領域と旧世代領域に細分化されます。新世代エリアの主な生存者は頻繁に生まれ、頻繁に破壊されるオブジェクトです。これはガベージ コレクターのターゲットになります。旧世代エリアの存続には安定したオブジェクトが必要なため、ガベージコレクターがここを訪れることはほとんどありません。


大部分のオブジェクトは生存期間が短く、新しい世代で生き続けます。したがって、新生代の地域は通常、旧時代の地域よりも広いです。


メソッド領域

メソッド領域は、ロードされたクラスの情報を記録します。完全修飾名 (パッケージ名 + クラス名)、メソッド、フィールド、記述子、パラメーター、定数、静的変数など。この領域もすべてのスレッドで共有されます。

このエリアには「永遠の時代」という名前もあり、このエリアがめったにクリアされないことを意味します。クラスのクリーンアップ範囲は非常に小さく、クラスが不要になったかどうかを判断するための要件が​​より厳しいため、ガベージ コレクターがこの領域をクリーンアップすることはほとんどありません。


実行時定数プール


この領域は、コンパイル中に生成されたリテラルおよびシンボル参照を記録します。また、すべてのスレッドで共有されます。


Literal

Literalには、二重引用符「」でマークされた文字列と、コード内にハードコーディングされたいくつかの基本的なデータ型が含まれます。これらはすべて定数です。


jdk1.6 では、ランタイム定数プールはメソッド領域の一部です。定数が見つかった場合は、まずその定数がランタイム定数プールに既に格納されているかどうかを確認し、そうでない場合はコピーをランタイム定数プールにコピーします。その後、同じ値の定数を作成しようとするたびに、ランタイム定数プールが直接参照されます。


jdk1.7 から、ランタイム定数プールがヒープに分割されました。定数が初めて出現した場合、その定数は実行時定数プールにコピーされなくなりますが、定数が初めて出現するメモリ アドレスを指す参照は実行時定数プールに保持されます。


ダイレクトメモリ

この領域は実際にはjvmの一部ではなく、他のプロセスに属します。ネイティブ メソッドが呼び出されるとき、ダイレクト メモリが生成される場合があります。

ダイレクトメモリとは、ネイティブメソッドで使用されるメモリ空間を指します。たとえば、NIO 操作では、ファイルの読み取りと書き込みにネイティブ メソッドが使用されます。このとき、ファイルの読み取りと書き込み用のメモリ (キャッシュ) を指すダイレクト メモリが生成されます。


ダイレクト メモリは jvm にはありませんが、メモリ空間のダイレクト メモリを指す参照が jvm ヒープに維持されることに注意してください。これにより、NIO と同様の操作でメモリ空間と Java ヒープの間でデータが頻繁にコピーされることが回避されます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。