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

2022-08-31 17:41:39

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

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

enter image description here

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

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

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

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

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

更新:我为进程的运行时物理内存绘制图片。
enter image description here


答案 1

我不明白的是,既然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+使用的原生线程。

我认为你是在假设有更多的魔力或晦涩难懂。相反,您应该假设已经使用了最简单,最高效和最轻量级的设计,并且您不会走得太远。

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

基本上是一对一的。


答案 2