ホームページ >Java >&#&チュートリアル >JVMメモリモデルのグラフィック例

JVMメモリモデルのグラフィック例

PHP中文网
PHP中文网オリジナル
2017-06-20 16:44:032132ブラウズ

1. JVMメモリモデル図

JVM ランタイム データ領域 (JVM ランタイム領域) は、実際には、JVM の実行中の JVM メモリ空間の分割と割り当てを指します。インターネット上で見つけた 2 つの図は次のとおりです (個人的には、2 番目の図の Native Method Stack は Java Thead モジュールで描画されるべきだと思います):

スタック

領域

スタックはJava仮想マシンスタックとローカルメソッドスタックに分かれています

重要なポイントは、

Java仮想マシンスタックはスレッドプライベートであり、スレッドと同じライフサイクルを持っています

    各メソッドの実行により、
  • ローカル変数テーブル、操作スタック、ダイナミックリンク、メソッドエクスポート

    などを保存するために使用されるスタックフレームが作成されます。各メソッドは実行されるまで呼び出されます。仮想マシンのスタック フレームがスタックにプッシュされてからスタックからポップアウトされるまでのプロセスに対応します。

    スタックは通常、コンパイル中に認識される 8 つの基本データ型、オブジェクト参照、命令アドレスを格納するローカル変数テーブル部分を指します。ローカル変数テーブルは、
  • コンパイル
  • 中に割り当てられ、メソッドを開始すると、このスタック内のローカル変数に割り当てられるメモリ サイズが決定されます。

    StackOverFlowError と OutOfMemoneyError という 2 つの例外があります。スレッド要求のスタックの深さが仮想マシンで許可されている深さよりも大きい場合は、StackOverFlowError エラーがスローされます。仮想マシンのスタックは動的に拡張され、拡張が十分なメモリ領域に適用できない場合は、OutOfMemoneyError がスローされます。

  • ローカル メソッド スタックは、仮想マシンによって使用されるローカル メソッド (ネイティブ) を提供し、スレッドプライベートでもあります

  • 2. ヒープ領域

  • ヒープは、仮想マシンの起動時に作成され、オブジェクト インスタンスを保存することのみを目的としています。

ヒープ領域はGCのメイン領域で、通常は若い世代と古い世代の2つのブロックに分かれています。より詳細に説明すると、若い世代は、新しく作成されたオブジェクトが保存される From survivor と To survivor の gc で生き残ったオブジェクトが保存される Eden 領域に分割されます。デフォルトでは、それぞれが 8:1:1 を占めます。

ただし、多くの記事では3つのブロックに分かれており、メソッド領域が永続世代としてカウントされると紹介されています。これはおそらく Hotspot 仮想マシン部門に基づくもので、たとえば IBM j9 には永続世代の紹介がありません。分割方法に関係なく、オブジェクト インスタンスは保存されます。

    例外 OutOfMemoneyError が発生します
  • 3. メソッド領域

  • は、すべての
  • スレッド

    領域によって共有され、

    クラス情報、定数、静的変数などを格納するために使用されます。仮想マシン
  • データ
によってロードされました。 Java 仮想マシンによってヒープの論理部分として記述されます。これを永久世代とも呼ぶのが通例です

    ガベージコレクションがこの領域に来ることはほとんどありませんが、主に定期的なプールのリサイクルとタイプのアンロードのためにリサイクルする必要もあります
  • 定数プールは、コンパイル時中に生成されるさまざまなバイトコードとシンボル参照を保存するために使用され、

    コンパイル時
  • 中に生成される定数を保存できます。文字列の intern() メソッドなどの定数プールに追加することもできます。
  • 4.
  • プログラムカウンター
  • 現在のスレッドによって実行される行番号インジケーター。カウンタの値を変更することで次の命令を決定します。ループ、分岐、ジャンプ、例外処理、スレッド回復などはすべてカウンタに依存します。

Java 仮想マシンのマルチスレッドは、スレッドを順番に切り替えてプロセッサの実行時間を割り当てることによって実装されます。 スレッド切り替えが正しい位置に戻るためには、各スレッドに独立したプログラムカウンターが必要であるため、スレッドプライベートとなります。

  • 唯一の Java 仮想マシンは OutofMemoryError ブロックを指定しません

  • 3. データ領域の概要
  • 名前
  • 特徴

機能-Xms- XX:PermSize:16M ダイレクトメモリ (ダイレクトメモリ) ) は仮想マシンのランタイム データ領域の一部ではなく、Java 仮想マシン仕様で定義されているメモリ領域でもありませんが、メモリのこの部分も頻繁に使用され、OutOfMemoryError 例外を引き起こす可能性もあるため、ここで説明します。 5. 拡張: ヒープとスタックの比較ヒープは柔軟性がありますが、安全ではありません。オブジェクトの場合は、動的に作成して破棄する必要があり、後から作成したオブジェクトが破棄されないとは言えず、その場合プログラムが実行しにくくなるため、ヒープを使用します。 Java にオブジェクトを保存します。ヒープ内のオブジェクトが破棄された後、このオブジェクトを参照し続けると、有名な NullPointerException が発生します。これはヒープの欠点であり、不正な参照ロジックは実行時にのみ発見されます。 スタック -- 主に参照と基本的なデータ型を保存します。 ヒープ -- new によって生成されたオブジェクト インスタンスを保存するために使用されます。

構成パラメータ

例外

プログラムカウンター

は小さなメモリを占有し、スレッドはプライベートであり、ライフサイクルはスレッドと同じです

おおよそのバイトコード行番号インジケーター

なし

なし

仮想マシンスタック

スレッドプライベート、ライフサイクルはスレッドと同じ、連続メモリ空間を使用

Javaメソッド実行用のメモリモデル、ストアローカル変数テーブル、オペレーションスタック、ダイナミックリンク、メソッド出口など情報

-

オブジェクト インスタンスを保存します。すべてのオブジェクト インスタンス (配列を含む) はヒープ上に割り当てられます

-Xsx

-Xmn

Outメモリエラー

メソッド領域

スレッド共有、ライフサイクルは仮想マシンのライフサイクルと同じであり、

クラス情報、定数、静的データなどのデータを保存するために連続したメモリアドレスを使用することはできません

仮想マシンによってロードされた変数、およびジャストインタイム コンパイラによってコンパイルされたコード

-XX:MaxPermSize:64M

OutOfMemoryError

ランタイム定数プールの一部

メソッド領域、動的

ストレージ リテラルおよびシンボリック参照

4. 拡張機能: ダイレクトメモリ

NIO (NewInput/Output) クラスが JDK 1.4 に追加され、Channel と Buffer に基づく I/O メソッドが導入され、ネイティブ関数ライブラリを使用してオフヒープ メモリを直接割り当てることができ、DirectByteBuffer を通じて動作します。オブジェクトは、このメモリへの参照として Java ヒープに保存されます。これにより、Java ヒープとネイティブ ヒープの間でのデータのコピーが回避されるため、一部のシナリオではパフォーマンスが大幅に向上します。

よく Java メモリをヒープ メモリ (Heap) とスタック メモリ (Stack) に分ける人がいますが、この分割は実際にははるかに複雑です。これより。 。この分割方法の人気は、ほとんどのプログラマが最も注目し、オブジェクト メモリの割り当てに最も密接に関係しているメモリ領域がこれら 2 つの領域であることを示しているだけです。

スタックは柔軟性はありませんが、厳格で安全で管理が簡単です。上位の参照が破壊されない限り、下位の参照はまだ存在する必要があるため、ほとんどのプログラムでは、最初に定義された変数と参照がスタックにプッシュされ、後で定義された変数も同時にスタックにプッシュされます。ブロックがスタックにプッシュされると、ブロック内の参照がエントリ領域に格納され、ブロックが終了するとスタックからポップされます。この仕組みを理解すると、さまざまなプログラミングにおけるスコープの概念が容易に理解できます。同時に、これはスタックの利点でもあり、コンパイル中にいつでも間違った参照ロジックが失われる可能性があります。

参照:

以上がJVMメモリモデルのグラフィック例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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