はじめに
この教材の見方
まず覚えるのは3つだけです。Javaコードの実行によって、変数とオブジェクトの関係がどう変わるかを見ていきます。
1
スタック領域 Stack
メソッドの作業場所
メソッドが呼び出されると、そのメソッド専用のStack Frameが作られます。この教材ではローカル変数、引数、オブジェクトへの参照などを表示します。メソッドが終了すると、そのFrameは取り除かれます。
2
ヒープ領域 Heap
オブジェクトを置く場所
newで作られたオブジェクトや配列などを表示します。参照されなくなっても、その瞬間に削除されるわけではありません。
3
参照
どのオブジェクトを参照するかを表す値
参照型の変数には、オブジェクト本体そのものではなく、そのオブジェクトを参照するための値が入ります。
参照
Heap
Person オブジェクトname = "Alice"
変数pは、Heap上のPersonオブジェクトを参照しています。
この教材の画面の見方
青いコード行現在実行しているJava文
黄色系Stack上の変数やFrame
青色系Heap上のオブジェクト
赤い矢印オブジェクトへの参照
青い破線プリミティブ値や参照値のコピー
光る要素今回追加・変更されたもの
Stack・Heap・参照の3つを手掛かりに、本編を1行ずつ進めましょう。
JVM詳細モードの入口
JVMメモリの地図
初心者モードで見たStackとHeapを土台に、JVM仕様上の実行時領域とHotSpotでの実装例を大まかに整理します。
PC Register
各スレッドが現在実行しているJVM命令の位置を管理します。CPUの物理レジスタそのものを示す説明ではありません。
普段は直接意識しない
JVM Stack
メソッドが呼び出されるたびにStack Frameが追加されます。初心者モードで見たStackを詳しく捉えたものです。
コード理解で意識する価値が高い
Native Method Stack
Java以外のnativeコードを実行するときに使用されることがある領域です。
この教材では存在を知れば十分
JVM全体で共有すべてのスレッドから利用される領域
Heap
オブジェクトや配列などを管理する共有領域です。初心者モードで見たHeapと同じものです。
コード理解で意識する価値が高い
JVM仕様Method Area
クラス単位の情報などを扱う、JVM仕様上の論理的な実行時データ領域です。
物理的な配置はJVM仕様で固定されない
HotSpotでの主な実装例
HotSpot実装例Metaspace
HotSpot JVMで、クラスメタデータの多くを管理するnative memory上の実装領域です。
Method Areaそのものではない
さらに詳しく:Classオブジェクトと内部メタデータ
HeapPerson.classjava.lang.Class
Java上の型: Class<Person>
[Class mirror]
↕JVM内部で対応
MetaspaceInstanceKlass<Person>クラス構造の内部メタデータ
この関係はJVM-3「Classオブジェクト / Reflection」で詳しく扱います。
この後のJVM詳細テーマでは、この地図の各部分を詳しく見ていきます。