ホームページ >Java >&#&チュートリアル >JVMメモリモデルのグラフィック例
JVM ランタイム データ領域 (JVM ランタイム領域) は、実際には、JVM の実行中の JVM メモリ空間の分割と割り当てを指します。インターネット上で見つけた 2 つの図は次のとおりです (個人的には、2 番目の図の Native Method Stack は Java Thead モジュールで描画されるべきだと思います):
スタック領域
スタックはJava仮想マシンスタックとローカルメソッドスタックに分かれていますなどを保存するために使用されるスタックフレームが作成されます。各メソッドは実行されるまで呼び出されます。仮想マシンのスタック フレームがスタックにプッシュされてからスタックからポップアウトされるまでのプロセスに対応します。
スタックは通常、コンパイル中に認識される 8 つの基本データ型、オブジェクト参照、命令アドレスを格納するローカル変数テーブル部分を指します。ローカル変数テーブルは、StackOverFlowError と OutOfMemoneyError という 2 つの例外があります。スレッド要求のスタックの深さが仮想マシンで許可されている深さよりも大きい場合は、StackOverFlowError エラーがスローされます。仮想マシンのスタックは動的に拡張され、拡張が十分なメモリ領域に適用できない場合は、OutOfMemoneyError がスローされます。
ローカル メソッド スタックは、仮想マシンによって使用されるローカル メソッド (ネイティブ) を提供し、スレッドプライベートでもあります。
2. ヒープ領域
ヒープは、仮想マシンの起動時に作成され、オブジェクト インスタンスを保存することのみを目的としています。
3. メソッド領域
領域によって共有され、
クラス情報、定数、静的変数などを格納するために使用されます。仮想マシン定数プールは、コンパイル時中に生成されるさまざまなバイトコードとシンボル参照を保存するために使用され、
コンパイル時4.
現在のスレッドによって実行される行番号インジケーター。カウンタの値を変更することで次の命令を決定します。ループ、分岐、ジャンプ、例外処理、スレッド回復などはすべてカウンタに依存します。
唯一の Java 仮想マシンは OutofMemoryError ブロックを指定しません
名前
特徴
構成パラメータ |
例外 |
|||
プログラムカウンター |
は小さなメモリを占有し、スレッドはプライベートであり、ライフサイクルはスレッドと同じです |
おおよそのバイトコード行番号インジケーター |
なし |
なし |
仮想マシンスタック |
スレッドプライベート、ライフサイクルはスレッドと同じ、連続メモリ空間を使用 |
Javaメソッド実行用のメモリモデル、ストアローカル変数テーブル、オペレーションスタック、ダイナミックリンク、メソッド出口など情報 |
- |
オブジェクト インスタンスを保存します。すべてのオブジェクト インスタンス (配列を含む) はヒープ上に割り当てられます |
-Xsx-Xmn | Outメモリエラー | メソッド領域 |
スレッド共有、ライフサイクルは仮想マシンのライフサイクルと同じであり、 クラス情報、定数、静的データなどのデータを保存するために連続したメモリアドレスを使用することはできません |
仮想マシンによってロードされた変数、およびジャストインタイム コンパイラによってコンパイルされたコード |
-XX:MaxPermSize:64M | OutOfMemoryError
|
ランタイム定数プールの一部 | メソッド領域、動的
ストレージ リテラルおよびシンボリック参照 |
|
4. 拡張機能: ダイレクトメモリ | ダイレクトメモリ (ダイレクトメモリ) ) は仮想マシンのランタイム データ領域の一部ではなく、Java 仮想マシン仕様で定義されているメモリ領域でもありませんが、メモリのこの部分も頻繁に使用され、OutOfMemoryError 例外を引き起こす可能性もあるため、ここで説明します。 NIO (NewInput/Output) クラスが JDK 1.4 に追加され、Channel と Buffer に基づく I/O メソッドが導入され、ネイティブ関数ライブラリを使用してオフヒープ メモリを直接割り当てることができ、DirectByteBuffer を通じて動作します。オブジェクトは、このメモリへの参照として Java ヒープに保存されます。これにより、Java ヒープとネイティブ ヒープの間でのデータのコピーが回避されるため、一部のシナリオではパフォーマンスが大幅に向上します。 | 5. 拡張: ヒープとスタックの比較よく Java メモリをヒープ メモリ (Heap) とスタック メモリ (Stack) に分ける人がいますが、この分割は実際にははるかに複雑です。これより。 。この分割方法の人気は、ほとんどのプログラマが最も注目し、オブジェクト メモリの割り当てに最も密接に関係しているメモリ領域がこれら 2 つの領域であることを示しているだけです。 | ヒープは柔軟性がありますが、安全ではありません。オブジェクトの場合は、動的に作成して破棄する必要があり、後から作成したオブジェクトが破棄されないとは言えず、その場合プログラムが実行しにくくなるため、ヒープを使用します。 Java にオブジェクトを保存します。ヒープ内のオブジェクトが破棄された後、このオブジェクトを参照し続けると、有名な NullPointerException が発生します。これはヒープの欠点であり、不正な参照ロジックは実行時にのみ発見されます。 スタックは柔軟性はありませんが、厳格で安全で管理が簡単です。上位の参照が破壊されない限り、下位の参照はまだ存在する必要があるため、ほとんどのプログラムでは、最初に定義された変数と参照がスタックにプッシュされ、後で定義された変数も同時にスタックにプッシュされます。ブロックがスタックにプッシュされると、ブロック内の参照がエントリ領域に格納され、ブロックが終了するとスタックからポップされます。この仕組みを理解すると、さまざまなプログラミングにおけるスコープの概念が容易に理解できます。同時に、これはスタックの利点でもあり、コンパイル中にいつでも間違った参照ロジックが失われる可能性があります。 | スタック -- 主に参照と基本的なデータ型を保存します。
参照:
以上がJVMメモリモデルのグラフィック例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。