コンパイラ本(ドラゴンブック)では、値型はスタック上に作成され、参照型はヒープ上に作成されると説明されています。
Java の場合、JVM にはランタイム データ領域にヒープとスタックも含まれます。オブジェクトと配列はヒープ上に作成され、メソッド フレームはスタックにプッシュされます。1 つのヒープはすべてのスレッドで共有されますが、各スレッドには独自のスタックがあります。次の図はこれを示しています。
私が理解できないのは、JVM は本質的にソフトウェアであるため、これらの JVM ヒープ、スタック、およびスレッドが物理マシンにどのようにマップされているかということです。
誰かがJavaとC ++の間でそれらの概念を比較できれば幸いです。Java は JVM で実行されますが、C++ は実行されないためです。
この質問をより正確にするために、次のことを知りたいです。
- Java と比較すると、C++ ランタイム データ領域はどのように見えますか? 上記の JVM のような適切な画像が見つかりません。
- JVM ヒープ、スタック、レジスタ、およびスレッドはオペレーティング システムにどのようにマップされますか? または、それらが物理マシンにどのようにマッピングされているかを尋ねる必要がありますか?
- 各 JVM スレッドは単なるユーザー スレッドであり、何らかの方法でカーネルにマップされるというのは本当ですか? (ユーザースレッドとカーネルスレッド)
更新:プロセスの実行時物理メモリの絵を描きます。