编译器书(The dragon book)解释了值类型是在栈上创建的,引用类型是在堆上创建的。
对于 Java,JVM 在运行时数据区也包含堆和栈。对象和数组在堆上创建,方法帧被推入堆栈。所有线程共享一个堆,而每个线程都有自己的堆栈。下图显示了这一点:
有关Java 运行时数据区的更多信息。
我不明白的是,既然 JVM 本质上是一个软件,那么那些 JVM 堆、堆栈和线程是如何映射到物理机的呢?
如果有人可以比较 Java 和 C++ 之间的这些概念,我将不胜感激。因为 Java 在 JVM 上运行,而 C++ 却没有。
为了使这个问题更准确,我想知道以下内容:
- 与 Java 相比,C++ 运行时数据区是什么样的?图片会很有帮助,我找不到像上面的 JVM 那样的好图片。
- JVM 堆、栈、寄存器和线程如何映射到操作系统?或者我应该问它们如何映射到物理机?
- 每个 JVM 线程都只是一个用户线程并以某种方式映射到内核,这是真的吗?(用户线程与内核线程)
更新:我为进程的运行时物理内存绘制了一张图片。