Javaランタイム・データ領域
Java仮想マシンの深い理解
概要
プログラム・カウンタ
現在のスレッドが実行したバイトコード命令のインジケータ
機能
- スレッドセーフ。プロセッサは任意の時点で、1つのスレッドで1つの命令しか実行しません。
- スレッドプライベート。各スレッドは個別のプログラム・カウンタを持ち、スレッド間のカウンタは互いに影響しません。
詳細
- スレッドがJavaメソッドを実行している場合、このカウンタは実行中のVMバイトコード命令のアドレスを記録します。
- ローカルメソッドが実行されている場合、このカウンタ値はNULLでなければなりません。
Java仮想マシン仕様
このメモリ領域は、OutOfMemoryErrorのケースについてJava仮想マシン仕様に規定がない唯一の領域です。
Java仮想マシン・スタック
Javaメソッド実行のためのスレッドメモリモデル。
機能
- スレッド・プライベート。つまり、各スレッドは個別のJava仮想マシン・スタックを持ち、個々のスレッドのJava仮想マシン・スタックは互いに影響しません。
ランタイムの詳細
- メソッドが実行されるたびに、Java 仮想マシンは、変数テーブル、オペランド・スタック、動的接続、メソッドの終了、およびその他の情報を格納するためのスタック・フレームを同期的に作成します。
- 実行が完了するまで呼び出される各メソッドは、仮想マシンのスタック上でinからoutに向かうスタックフレームに対応します。
- ローカル変数テーブルは、コンパイル時に既知のさまざまなJava仮想マシンの基本データ型とオブジェクト参照を保持します。
Java仮想マシン仕様
- スレッドが仮想マシンで許容される以上の深さのスタックを要求すると、StackOverflowError 例外がスローされます。
- Java VMスタック容量が動的に拡張できる場合、拡張時にスタックが十分なメモリーを要求できなかったときにOutOfMemoryError例外がスローされます。
ローカル・メソッド・スタック
ローカルメソッド実行スレッドメモリモデル。
機能
- スレッドのプライベート
Java仮想マシン仕様
- Java仮想マシン仕様には、ローカル・メソッド・スタック内のメソッドの言語、使用法、データ構造に関する強制的な規則がないため、特定の仮想マシンが必要に応じて自由に実装できます。
- ローカル・メソッド・スタックは、スタックの深さがオーバーフローしたときやスタック拡張に失敗したときに、それぞれStackOverflowError例外やOutOfMemoryError例外もスローします。
Java
オブジェクトのインスタンスを格納します。
機能
- メモリの最大値。
- スレッドの共有
- 仮想マシンの起動時に作成
Java仮想マシン仕様
- 配列だけでなく、すべてのオブジェクト・インスタンスもヒープ上に割り当てる必要があります。
メソッド領域
型情報、定数、スタティック変数、オンザフライでコンパイラがコンパイルしたコードキャッシュなど、仮想マシンによってロードされたデータを格納します。
Java仮想マシン仕様
この領域におけるメモリ再利用の目標は、主に常時プールの再利用、タイプのアンロードです。
ランタイム定数プール
コンパイル時に生成されるさまざまなリテラルや記号参照を保持するメソッド領域の一部。
機能
- クラスはロード後に格納されます。
- 新しい定数は、実行時にプールに入れることもできます。例えば、String クラスの intern() メソッドです。
Java仮想マシン仕様
- 必要な細かいことは何もしていません