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

时间:2013-04-28 14:53:37

标签: java c++ memory jvm runtime

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

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

enter image description here

有关Java run-time data areas的更多信息。

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

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

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

  1. 与Java相比,C ++运行时数据区是什么样的?一张图片会有所帮助,我找不到像上面的JVM那样好的图片。
  2. JVM堆,堆栈,寄存器和线程如何映射到操作系统?或者我应该问他们如何映射到物理机器?
  3. 每个JVM线程只是一个用户线程并以某种方式映射到kernal是真的吗? (用户线程与内核线程)
  4. 更新: 我为一个过程的运行时物理内存绘制了一张图片 enter image description here

1 个答案:

答案 0 :(得分:35)

  

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

堆是预先分配的虚拟内存连续区域。 e.g。

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

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

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

本机线程是OS功能,它不是JVM空间的一部分。

  

因为Java在JVM上运行,但C ++不运行。

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

  

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

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

  

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

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

我认为你假设有更多的魔法或默默无闻的存在。相反,你应该假设使用了最简单,高效和轻量级的设计,你就不会有太远的距离。

  

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

基本上是一对一的。