56

编译器书(The dragon book)解释了值类型是在栈上创建的,引用类型是在堆上创建的。

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

在此处输入图像描述

有关Java 运行时数据区的更多信息。

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

如果有人可以比较 Java 和 C++ 之间的这些概念,我将不胜感激。因为 Java 在 JVM 上运行,而 C++ 却没有。

为了使这个问题更准确,我想知道以下内容:

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

更新:我为进程的运行时物理内存绘制了一张图片。
在此处输入图像描述

4

1 回答 1

39

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

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

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

当线程启动时,堆栈由线程库分配。同样,它是虚拟内存的连续区域,是最大堆栈大小。再次,您可以将其视为

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

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

因为 Java 在 JVM 上运行,而 C++ 却没有。

C++ 仍然需要运行时环境和库才能启动。尝试删除您的 C++ 运行时或 libc,这些将无法启动。

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

您可以使用一大块虚拟内存。没有图片,因为它不会告诉你太多。想象一个标有用户空间的长矩形。

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

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

我认为您假设发生的事情比实际情况更多。相反,您应该假设已经使用了最简单、高效和轻量级的设计,并且离您不远了。

我应该问它们是如何映射到物理机的?

基本上是一对一的。

于 2013-04-28T16:58:57.430 回答