JVM堆栈,堆和线程如何映射到物理内存或操作系统

编译器书(龙书)解释了在堆栈上创build值types,并在堆上创build引用types。

对于Java,JVM还包含运行时数据区域中的堆栈和堆栈。 对象和数组在堆上创build,方法框架被推入堆栈。 一个堆被所有线程共享,而每个线程都有自己的堆栈。 下图显示了这一点:

在这里输入图像说明

关于Java运行时数据区域的更多信息

我不明白的是,由于JVM本质上是一个软件,那么这些JVM堆,堆栈和线程如何映射到物理机器呢?

如果有人能比较Java和C ++之间的概念,我将不胜感激。 因为Java在JVM上运行,但是C ++没有。

为了使这个问题更加精确,我想知道以下几点:

  1. 与Java相比,C ++运行时数据区是什么样的? 一张照片会很有帮助,我找不到像上面的JVM那样的好照片。
  2. JVM堆,堆栈,寄存器和线程如何映射到操作系统? 或者我应该问他们如何映射到物理机器?
  3. 每个JVM线程是否仅仅是一个用户线程,并以某种方式映射到内核? (用户线程vs内核线程)

更新 :我画一个进程的运行时物理内存的图片。
在这里输入图像说明

我不明白的是,由于JVM本质上是一个软件,那么这些JVM堆,堆栈和线程如何映射到物理机器?

堆是虚拟内存的预分配连续区域。 例如

void* heap = malloc(Xmx); // get the maximum size. 

线程启动时,由线程库分配堆栈。 再次,它是一个连续的虚拟内存区域,是最大的堆栈大小。 你可以再次想到它

  void* stack = malloc(Xss); // get the maximum stack size. 

本机线程是不属于JVM空间的操作系统function。

因为Java在JVM上运行,但是C ++没有。

C ++仍然需要一个运行时环境和库来启动。 尝试删除您的C ++运行时或libc,这些将不会启动。

与Java相比,C ++运行时数据区是什么样的?

有一个大的虚拟内存区域可以使用。 没有照片,因为它不会告诉你很多。 设想一个长矩形标记的用户空间。

JVM堆,堆栈,寄存器和线程如何映射到操作系统? 或者我应该问他们如何映射到物理机器?

再次没有魔法。 JVM堆是内存区域,JVM堆栈与C +使用的本地堆栈相同,JVM的寄存器与C +使用的本地寄存器相同,而JVM线程实际上是本地线程,这是C +使用的。

我认为你认为现在还有更多的魔法或默默无闻。 相反,你应该假设最简单,高效和轻便的devise已经被使用,你不会离得很远。

我应该问他们如何映射到物理机器?

基本上一对一。